IopRetrieveTransactionParameters
NTSTATUS __stdcall IopRetrieveTransactionParameters(
_DEVICE_OBJECT *DeviceObject,
_OPEN_PACKET *Op,
UINT64 DesiredAccess,
_FILE_OBJECT *FileObject){
int v5;
NTSTATUS result;
int v9;
_ETHREAD *CurrentThread;
_WORD *Teb;
_WORD *v12;
__int16 v13;
NTSTATUS v14;
_HANDLE Handle[2];
PVOID Object;
VOID *TypeExt;
v5 = DesiredAccess;
TypeExt = 0i64;
*(_QWORD *)Handle = 0i64;
v13 = 0;
result = TmCurrentTransaction(Handle);
v9 = result;
v14 = result;
if( result == -1073741637 )
{
v9 = 0;
v14 = 0;
}
else if( result < 0 )
{
return result;
}
if( *(_QWORD *)Handle )
{
CurrentThread = (_ETHREAD *)KeGetCurrentThread();
if( (CurrentThread->Tcb._bf_0 & 0x400) != 0
|| CurrentThread->Tcb.ApcStateIndex == 1
|| (Teb = CurrentThread->Tcb.Teb) == 0i64 )
{
v9 = -1072103400;
}
else
{
v13 = Teb[372];
v9 = v14;
}
}
if( v9 < 0 || !*(_QWORD *)Handle )
return v9;
if( IopCheckStackForTransactionSupport(DeviceObject)
|| (Op->ShareAccess &= 1u, Op->Disposition == 1) && (v5 & 0xFEEDFF56) == 0
|| Op->QueryOnly )
{
Object = 0i64;
if( ObReferenceObjectByHandle(
*(VOID **)Handle,
0x120037ui64,
(_OBJECT_TYPE *)TmTransactionObjectType,
1,
&Object,
0i64) < 0 )
return -1072103400;
IopGetSetSpecificExtension(FileObject, FoExtTypeTransactionParams, 0x10ui64, 1u, &TypeExt, 0i64);
v9 = result;
if( result >= 0 )
{
v12 = TypeExt;
*(_WORD *)TypeExt = 16;
v12[1] = v13;
*((_QWORD *)v12 + 1) = Object;
return result;
}
HalPutDmaAdapter((PADAPTER_OBJECT)Object);
return v9;
}
return -1072103361;
}Referenced by:
IopAllocRealFileObject
IopParseDevice