IopGetSetObjectId
INT64 __stdcall IopGetSetObjectId(FILE_OBJECT *FileObject, VOID *Buffer, UINT64 Length, UINT64 Function){
int v4;
ULONG v7;
_DEVICE_OBJECT *RelatedDeviceObject;
PIRP v9;
IRP *v10;
__int64 v11;
INT64 result;
struct _IO_STATUS_BLOCK IoStatusBlock;
struct _KEVENT Object;
v4 = Length;
memset(&Object, 0, sizeof(Object));
v7 = Function;
IoStatusBlock = 0i64;
KeInitializeEvent(&Object, NotificationEvent, 0);
RelatedDeviceObject = IoGetRelatedDeviceObject(FileObject);
v9 = IoBuildDeviceIoControlRequest(v7, RelatedDeviceObject, 0i64, 0, 0i64, 0, 0, &Object, &IoStatusBlock);
v10 = v9;
if( !v9 )
return 3221225626i64;
*((_DWORD *)v9 + 4) |= 4u;
*((_QWORD *)v9 + 14) = Buffer;
*((_QWORD *)v9 + 3) = Buffer;
*((_QWORD *)v9 + 24) = FileObject;
v11 = *((_QWORD *)v9 + 23);
*(_QWORD *)(v11 - 24) = FileObject;
*(_WORD *)(v11 - 72) = 1037;
if( v7 == 589980 || v7 == 1310952 || v7 == 590016 )
*(_DWORD *)(v11 - 64) = v4;
else
*(_DWORD *)(v11 - 56) = v4;
ObfReferenceObject(FileObject);
LODWORD(result) = IofCallDriver(RelatedDeviceObject, v10);
if( (_DWORD)result == 259 )
{
KeWaitForSingleObject(&Object, Executive, 0, 0, 0i64);
return(unsigned int)IoStatusBlock.Status;
}
return result;
}Referenced by:
IopTrackLink