PiCMOpenClassKey
NTSTATUS __stdcall PiCMOpenClassKey(
PVOID IoctlInputBuffer,
UINT64 IoctlInputBufferSize,
PVOID IoctlOutputBuffer,
UINT64 IoctlOutputBufferSize,
UINT64 *BytesUsed){
unsigned int *v5;
unsigned int v6;
INT8 v8;
__int64 v9;
NTSTATUS v10;
__int64 v11;
int v12;
int inited;
__int64 v14;
__int64 v15;
bool v16;
unsigned int v17;
UINT64 v18;
bool v19;
int v20;
int v22;
HANDLE *IoctlOutputBufferSizea;
__int64 a7;
__int64 a8;
HANDLE v26;
struct _UNICODE_STRING DestinationString;
INT64 a4[2];
PCWSTR SourceString[2];
unsigned int ExpectedOutputSize[4];
HANDLE Handle;
v5 = (unsigned int *)Handle;
v6 = IoctlOutputBufferSize;
Handle = 0i64;
v26 = 0i64;
*v5 = 0;
*(_OWORD *)a4 = 0i64;
*(_OWORD *)SourceString = 0i64;
v8 = *((_BYTE *)KeGetCurrentThread() + 562);
*(_OWORD *)ExpectedOutputSize = 0i64;
DestinationString = 0i64;
v10 = PiCMCaptureRegistryInputData(IoctlInputBuffer, IoctlInputBufferSize, (unsigned int)BytesUsed, (INT64)a4);
if( v10 < 0 )
goto LABEL_19;
if( HIDWORD(a4[0])
|| ExpectedOutputSize[1]
|| !IoctlOutputBuffer
|| v6 < 0x10
|| (v12 = a4[1], (unsigned int)(LODWORD(a4[1]) - 2) > 1) )
{
inited = -1073741811;
goto LABEL_15;
}
if( !SourceString[0] )
{
v17 = HIDWORD(SourceString[1]);
inited = PnpCtxOpenContextBaseKey(
v9,
8 - (unsigned int)(LODWORD(a4[1]) != 3),
v11,
HIDWORD(SourceString[1]),
&Handle);
v19 = inited < 0;
LABEL_13:
if( !v19 )
{
IoctlOutputBufferSizea = &v26;
PiCMDuplicateRegistryHandle(Handle, v18, (UINT64 *)v17, v8);
inited = v20;
}
goto LABEL_15;
}
inited = RtlInitUnicodeStringEx(&DestinationString, (WCHAR *)SourceString[0]);
if( inited >= 0 )
{
inited = RtlUpcaseUnicodeString(&DestinationString, &DestinationString, 0);
if( inited >= 0 )
{
v16 = v12 == 3;
v17 = HIDWORD(SourceString[1]);
if( v16 )
{
inited = CmOpenInterfaceClassRegKey(
PiPnpRtlCtx,
SourceString[0],
v14,
v15,
SHIDWORD(SourceString[1]),
0,
(__int64)&Handle,
0i64);
if( inited != -1073741772 )
goto LABEL_12;
if( ExpectedOutputSize[0] == 1 )
{
if( PiAuDoesClientHaveAccess(2ui64) )
{
v22 = CmCreateInterfaceClass(PiPnpRtlCtx, SourceString[0], v17, &Handle, 0i64, 0);
LABEL_25:
inited = v22;
goto LABEL_12;
}
goto LABEL_24;
}
}
else
{
inited = CmOpenInstallerClassRegKey(
PiPnpRtlCtx,
SourceString[0],
v14,
v15,
SHIDWORD(SourceString[1]),
0,
(__int64)&Handle,
0i64);
if( inited != -1073741772 )
{
LABEL_12:
v19 = inited < 0;
goto LABEL_13;
}
if( ExpectedOutputSize[0] == 1 )
{
if( PiAuDoesClientHaveAccess(2ui64) )
{
v22 = CmCreateInstallerClass(PiPnpRtlCtx, SourceString[0], v17, &Handle, 0i64, 0);
goto LABEL_25;
}
LABEL_24:
inited = -1073741790;
}
}
}
}
LABEL_15:
LODWORD(IoctlOutputBufferSizea) = v6;
v10 = PiCMReturnHandleResultData(
inited,
v26,
ExpectedOutputSize[2],
IoctlOutputBuffer,
(__int64)IoctlOutputBufferSizea,
v5,
a7,
a8);
if( Handle )
ZwClose(Handle);
if( v10 < 0 || inited < 0 )
{
if( v26 )
ObCloseHandle(v26, v8);
}
LABEL_19:
PiCMReleaseRegistryInputData((INT64)a4);
return v10;
}Referenced by:
No references.