FsRtlIssueDeviceIoControl
NTSTATUS __stdcall FsRtlIssueDeviceIoControl(
_DEVICE_OBJECT *DeviceObject,
UINT64 IoCtl,
UINT8 IrpFlags,
VOID *InputBuffer,
UINT64 InputBufferLength,
VOID *OutputBuffer,
UINT64 OutputBufferLength,
UINT64 *IosbInformation){
UINT32 v9;
PIRP *v12;
int Status;
_IO_STATUS_BLOCK IoStatusBlock;
__int128 Object;
__int64 v17;
v9 = IoCtl;
Object = 0i64;
v17 = 0i64;
IoStatusBlock = 0i64;
KeInitializeEvent((INT64)&Object, 0, 0);
v12 = IoBuildDeviceIoControlRequest(
v9,
DeviceObject,
InputBuffer,
InputBufferLength,
OutputBuffer,
OutputBufferLength,
0,
(PKEVENT)&Object,
&IoStatusBlock);
if( !v12 )
return -1073741670;
BYTE2(v12[23][-1].Tail.DriverContext[2]) |= IrpFlags;
Status = IofCallDriver((UINT64)DeviceObject, (UINT64)v12);
if( Status == 259 )
{
KeWaitForSingleObject((UINT64)&Object, 0, 0, 0, 0i64);
Status = IoStatusBlock.Status;
}
if( Status >= 0 )
{
if( IosbInformation )
*IosbInformation = IoStatusBlock.Information;
}
return Status;
}Referenced by:
FsRtlGetSectorSizeInformation
FsRtlVolumeDeviceToCorrelationId