How to use IcmpSendEcho2 with PIO_APC_ROUTINE?

2019-03-06 11:49发布

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.

1条回答
时光不老,我们不散
2楼-- · 2019-03-06 12:05

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.

查看更多
登录 后发表回答