Как обнулить 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);
}
Но ни к чему хорошему это не привело. Процесс попросту крашнулся.