Функция DeviceIoControlEx.
Win32 API ????????????? «Ex» ???????? ??????? ReadFile ? WriteFile, ? ?? ????? ??? «Ex» ???????? ??????? DeviceIoControl ?? ????????????. ????????? ???? ?????????? ????? ??????, ??? ??? ??????????????? ??????? Native API ??????????????? ? MSDN: NtDeviceIoControlFile (???? ? ???????? ??? «Deprecated»). ???????? ????? ??????? ????? ????????? ??? ???:
BOOL
WINAPI
DeviceIoControlEx(
__in HANDLE hDevice,
__in DWORD dwIoControlCode,
__in_opt LPVOID lpInBuffer,
__in DWORD nInBufferSize,
__out_opt LPVOID lpOutBuffer,
__in DWORD nOutBufferSize,
__inout LPOVERLAPPED lpOverlapped,
__in_opt LPOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine
);
??????? ?? DeviceIoControl ???: ?????????? ??????????? ???? ???????????? ? ????????? OVERLAPPED ? ???? ??????????? ???????? ????????? ?? completion callback (???????? ?? ??? ???????????).
NtDeviceIoControlFile ????? ?????????? ??? ???:
PIO_STATUS_BLOCK IoStatusBlock = (PIO_STATUS_BLOCK)&lpOverlapped->Internal;
IoStatusBlock->Status = STATUS_PENDING;
NTSTATUS Status =
NtDeviceIoControlFile(
hDevice,
NULL,
ApcRoutine,<br> lpCompletionRoutine,<br> IoStatusBlock,
dwIoControlCode,
lpInBuffer,
nInBufferSize,
lpOutBuffer,
nOutBufferSize);
if (!NT_SUCCESS(Status))
{
SetLastError(RtlNtStatusToDosError(Status) );
return FALSE;
}
return TRUE;
????? ????????? OVERLAPPED ???????????? ??? IO_STATUS_BLOCK. ????? ????? ????????? ReadFileEx ? WriteFileEx. NTSTATUS ???? ?????? ????????????? ? Win32 ??????? ???????? RtlNtStatusToDosError, ??????? ????? ??????????????? ? MSDN. ????????? callback-?? Win32 ? Native API ??????????, ??????? ???????????? ??????????????? ??????? ApcRoutine:
VOID
WINAPI
ApcRoutine(
__in PVOID Context,
__in PIO_STATUS_BLOCK IoStatusBlock,
__reserved DWORD Reserved
)
{
DWORD BytesTransfered = 0;
if (NT_SUCCESS(IoStatusBlock->Status))
{
BytesTransfered = (DWORD)IoStatusBlock->Information;
}
((LPOVERLAPPED_COMPLETION_ROUTINE)Context)(
RtlNtStatusToDosError(IoStatusBlock->Status),
BytesTransfered,
CONTAINING_RECORD(IoStatusBlock, OVERLAPPED, Internal));
}
? ?????????? ??????? DeviceIoControlEx ???????? ????? ????? ?? ?????????? ??????, ??? ? ReadFileEx, ? WriteFileEx.
Cross-posted from blog.not-a-kernel-guy.com.