FsRtlIssueDeviceIoControl
NTSTATUS __stdcall FsRtlIssueDeviceIoControl(
_DEVICE_OBJECT *DeviceObject,
UINT64 IoCtl,
UINT8 IrpFlags,
PVOID InputBuffer,
UINT64 InputBufferLength,
PVOID OutputBuffer,
UINT64 OutputBufferLength,
UINT64 *IosbInformation){
ULONG v9;
PIRP v12;
int Status;
struct _IO_STATUS_BLOCK IoStatusBlock;
struct _KEVENT Object;
v9 = IoCtl;
memset(&Object, 0, sizeof(Object));
IoStatusBlock = 0i64;
KeInitializeEvent(&Object, NotificationEvent, 0);
v12 = IoBuildDeviceIoControlRequest(
v9,
DeviceObject,
InputBuffer,
InputBufferLength,
OutputBuffer,
OutputBufferLength,
0,
&Object,
&IoStatusBlock);
if( !v12 )
return -1073741670;
*(_BYTE *)(*((_QWORD *)v12 + 23) - 70i64) |= IrpFlags;
Status = IofCallDriver(DeviceObject, v12);
if( Status == 259 )
{
KeWaitForSingleObject(&Object, Executive, 0, 0, 0i64);
Status = IoStatusBlock.Status;
}
if( Status >= 0 )
{
if( IosbInformation )
*IosbInformation = IoStatusBlock.Information;
}
return Status;
}Referenced by:
FsRtlGetSectorSizeInformation
FsRtlVolumeDeviceToCorrelationId