0

I'm a c++ newbie and I'm trying to make a "ping tool" with IcmpSendEcho2 but I can't make it to work with APCs.

I'm running into this compiling error:

>error C2220: warning treated as error - no 'object' file generated
>warning C4191: 'type cast' : unsafe conversion from 'PIO_APC_ROUTINE (__cdecl *)(PVOID,PIO_STATUS_BLOCK,ULONG)' to 'PIO_APC_ROUTINE'
>          Calling this function through the result pointer may cause your program to fail

This is my APC declaration:

PIO_APC_ROUTINE GotIt(PVOID param, PIO_STATUS_BLOCK IoStatusBlock, ULONG Reserved);

This is my APC definition:

PIO_APC_ROUTINE GotIt(PVOID param, PIO_STATUS_BLOCK IoStatusBlock, ULONG Reserved)
{
    printf("GOT IT!\n");
    return NULL;
}

And this is how I make the IcmpSendEcho2:

DWORD dwRetVal = IcmpSendEcho2(hIcmpFile, NULL, (PIO_APC_ROUTINE) GotIt, NULL,
                     ipaddr, SendData, sizeof (SendData), NULL,
                     ReplyBuffer, ReplySize, 1000);

I thought '(PIO_APC_Rountine) GotIt' would do it, because I found this, but apparently I'm missing something.

If you need any additional information, let me know.

Thanks in advanced.

Rui
  • 494
  • 1
  • 6
  • 20

1 Answers1

3

First, don't cast callback functions. Ever.

Second, PIO_APC_ROUTINE is declared as:

typedef
VOID
(NTAPI *PIO_APC_ROUTINE) (
    IN PVOID ApcContext,
    IN PIO_STATUS_BLOCK IoStatusBlock,
    IN ULONG Reserved
    );

So your GotIt function should be:

VOID NTAPI GotIt(
    IN PVOID ApcContext,
    IN PIO_STATUS_BLOCK IoStatusBlock,
    IN ULONG Reserved
);

NTAPI is __stdcall, not the default __cdecl, which is what the error message is telling you.

What you've done with this:

PIO_APC_ROUTINE GotIt(PVOID param, PIO_STATUS_BLOCK IoStatusBlock, ULONG Reserved);

...is declare a function that returns a function pointer. This is not what you wanted.

Roger Lipscombe
  • 89,048
  • 55
  • 235
  • 380