SysCtxOpenMachine
__int64 __fastcall SysCtxOpenMachine(
__int64 a1,
__int64 a2,
__int64 a3,
__int64 a4,
HANDLE SourceHandle,
int a6,
__int64 a7){
int Version;
_OWORD *PoolWithTag;
__int64 v11;
_BYTE *v12;
int v13;
const WCHAR *v14;
__int64 v15;
__int64 v16;
void *v17;
UINT64 DesiredAccess;
UINT64 HandleAttributes;
UINT64 Options;
void *TargetHandle;
HANDLE Handle;
HANDLE v24;
HANDLE v25;
HANDLE v26;
struct _OSVERSIONINFOW VersionInformation;
unsigned __int8 v28;
unsigned __int8 v29;
Handle = 0i64;
v26 = 0i64;
v24 = 0i64;
v25 = 0i64;
Version = 0;
TargetHandle = 0i64;
*(_QWORD *)a7 = 0i64;
PoolWithTag = ExAllocatePoolWithTag(PagedPool, 0x38ui64, 0x53504E50ui64);
v12 = PoolWithTag;
if( !PoolWithTag )
{
Version = -1073741801;
goto LABEL_27;
}
v13 = a6;
*PoolWithTag = 0i64;
PoolWithTag[1] = 0i64;
PoolWithTag[2] = 0i64;
*((_QWORD *)PoolWithTag + 6) = 0i64;
if( !a6 )
{
memset((INT64)&VersionInformation.dwMajorVersion, 0i64);
VersionInformation.dwOSVersionInfoSize = 284;
Version = RtlGetVersion(&VersionInformation);
if( Version < 0 )
goto LABEL_27;
v11 = v28;
LOWORD(v11) = v28 << 8;
v13 = v29 | (unsigned __int16)v11 | ((LOBYTE(VersionInformation.dwMinorVersion) | (unsigned __int16)(LOBYTE(VersionInformation.dwMajorVersion) << 8)) << 16);
}
*(_DWORD *)v12 = v13;
if( SourceHandle )
{
LODWORD(Options) = 2;
LODWORD(HandleAttributes) = 0;
LODWORD(DesiredAccess) = 0;
Version = ZwDuplicateObject(
(PVOID)0xFFFFFFFFFFFFFFFFi64,
SourceHandle,
(PVOID)0xFFFFFFFFFFFFFFFFi64,
&TargetHandle,
DesiredAccess,
HandleAttributes,
Options);
if( Version < 0 )
{
TargetHandle = 0i64;
goto LABEL_15;
}
}
if( !a2 )
{
v14 = L"SYSTEM";
v15 = 2147483650i64;
goto LABEL_6;
}
if( a2 != -1 )
{
v14 = 0i64;
v15 = a2;
LABEL_6:
Version = RegRtlOpenKeyTransacted((char *)v15, v14, 0, 0x2000000u, &Handle, (__int64)TargetHandle);
if( Version )
goto LABEL_27;
}
if( !Handle || (Version = SysCtxOpenControlSet(v11, (char *)Handle, (__int64)TargetHandle, &v25)) == 0 )
{
if( a4 )
{
if( a4 == -1 )
goto LABEL_12;
v16 = a4;
}
else
{
v16 = 2147483651i64;
}
Version = RegRtlOpenKeyTransacted((char *)v16, 0i64, 0, 0x2000000u, &v24, (__int64)TargetHandle);
if( !Version )
{
LABEL_12:
v12[16] = 1;
v17 = 0i64;
*((_QWORD *)v12 + 1) = TargetHandle;
*((_QWORD *)v12 + 3) = Handle;
*((_QWORD *)v12 + 4) = v26;
*((_QWORD *)v12 + 6) = v25;
*((_QWORD *)v12 + 5) = v24;
*(_QWORD *)a7 = v12;
v12 = 0i64;
TargetHandle = 0i64;
Handle = 0i64;
v25 = 0i64;
v24 = 0i64;
goto LABEL_13;
}
}
LABEL_27:
v17 = TargetHandle;
LABEL_13:
if( v17 )
ZwClose(v17);
LABEL_15:
if( Handle )
ZwClose(Handle);
if( v26 )
ZwClose(v26);
if( v25 )
ZwClose(v25);
if( v24 )
ZwClose(v24);
if( v12 )
ExFreePoolWithTag(v12, 0);
return(unsigned int)Version;
}Referenced by:
PnpCtxCreateNode