Как обнулить readfds->fd_count изнутри ZwDeviceIoControlFile?

Установил перехват функции ZwDeviceIoControlFile, необходимо при получении IoControlCode равному IOCTL_AFD_SELECT обнулить readfds->fd_count.

Подобное я уже делал с перехваченной функцией select

int WSAAPI myselect(int nfds, fd_set* readfds, fd_set* writefds, fd_set* exceptfds, const timeval* timeout)
{
    readfds->fd_count = 0;
    return pselect(nfds, readfds, writefds, exceptfds, timeout);
}

Теперь аналогичное действие необходимо сделать уже с перехваченной функцией ZwDeviceIoControlFile. Проблема в том, что я не знаю как выйти на этот readfds.

NTSTATUS NTAPI myZwDeviceIoControlFile(
    HANDLE FileHandle,
    HANDLE Event,
    PIO_APC_ROUTINE ApcRoutine,
    PVOID ApcContext,
    PIO_STATUS_BLOCK IoStatusBlock,
    ULONG IoControlCode,
    PVOID InputBuffer,
    ULONG InputBufferLength,
    PVOID OutputBuffer,
    ULONG OutputBufferLength)
{
    if(IoControlCode == IOCTL_AFD_SELECT)
    {
        // Что тут делать?
    }

    // Вызов оригинальной функции
    return pZwDeviceIoControlFile(FileHandle, Event, ApcRoutine, ApcContext, IoStatusBlock, IoControlCode, InputBuffer, InputBufferLength, OutputBuffer, OutputBufferLength);
}

В интернете я нашел две структуры

struct AFD_POLL_HANDLE_INFO
{
    HANDLE handle;
    ULONG events;
    NTSTATUS status;
};

struct AFD_POLL_INFO
{
    LARGE_INTEGER timeout;
    ULONG numberOfHandles;
    ULONG exclusive;
    AFD_POLL_HANDLE_INFO* handles;
};

..и попытался ими воспользоваться.

if(IoControlCode == IOCTL_AFD_SELECT)
{
    AFD_POLL_INFO* info = reinterpret_cast<AFD_POLL_INFO*>(InputBuffer);

    for (int i = 0; i < info->numberOfHandles; i++)
        FD_ZERO(info->handles[i].handle);
}

Но ни к чему хорошему это не привело. Процесс попросту крашнулся.


Ответы (0 шт):