PiCMOpenDeviceKey
NTSTATUS __stdcall PiCMOpenDeviceKey(
PVOID IoctlInputBuffer,
UINT64 IoctlInputBufferSize,
PVOID IoctlOutputBuffer,
UINT64 IoctlOutputBufferSize,
UINT64 *BytesUsed){
unsigned int v5;
unsigned int *v6;
INT8 v8;
NTSTATUS v9;
const wchar_t *v10;
int v11;
unsigned int v12;
UINT64 v13;
int v14;
HANDLE *IoctlOutputBufferSizea;
__int64 a7;
__int64 v18;
HANDLE Handle;
HANDLE v20;
INT64 a4[2];
UINT64 *DesiredAccess[2];
unsigned int ExpectedOutputSize[4];
INT64 v24;
v20 = 0i64;
Handle = 0i64;
v5 = IoctlOutputBufferSize;
v6 = (unsigned int *)v24;
LODWORD(v24) = 0;
*(_OWORD *)a4 = 0i64;
*v6 = 0;
*(_OWORD *)DesiredAccess = 0i64;
*(_OWORD *)ExpectedOutputSize = 0i64;
v8 = *((_BYTE *)KeGetCurrentThread() + 562);
v9 = PiCMCaptureRegistryInputData(IoctlInputBuffer, IoctlInputBufferSize, (unsigned int)BytesUsed, (INT64)a4);
if( v9 < 0 )
goto LABEL_14;
v10 = (const wchar_t *)DesiredAccess[0];
if( DesiredAccess[0] && LODWORD(a4[1]) == 1 && IoctlOutputBuffer && v5 >= 0x10 )
{
v11 = PiCMConvertDeviceKeyType(SWORD2(a4[0]), &v24);
if( v11 >= 0 )
{
v12 = HIDWORD(DesiredAccess[1]);
v11 = CmOpenDeviceRegKey(
PiPnpRtlCtx,
v10,
v24,
ExpectedOutputSize[1],
SHIDWORD(DesiredAccess[1]),
0,
(__int64)&Handle,
0i64);
if( v11 != -1073741772 )
goto LABEL_8;
if( ExpectedOutputSize[0] == 1 )
{
if( PiAuDoesClientHaveAccess(2ui64) )
{
v11 = CmOpenDeviceRegKey(PiPnpRtlCtx, v10, v24, ExpectedOutputSize[1], v12, 1, (__int64)&Handle, 0i64);
LABEL_8:
if( v11 >= 0 )
{
IoctlOutputBufferSizea = &v20;
PiCMDuplicateRegistryHandle(Handle, v13, (UINT64 *)v12, v8);
v11 = v14;
}
goto LABEL_10;
}
v11 = -1073741790;
}
}
}
else
{
v11 = -1073741811;
}
LABEL_10:
LODWORD(IoctlOutputBufferSizea) = v5;
v9 = PiCMReturnHandleResultData(
v11,
v20,
ExpectedOutputSize[2],
IoctlOutputBuffer,
(__int64)IoctlOutputBufferSizea,
v6,
a7,
v18);
if( Handle )
ZwClose(Handle);
if( v9 < 0 || v11 < 0 )
{
if( v20 )
ObCloseHandle(v20, v8);
}
LABEL_14:
PiCMReleaseRegistryInputData((INT64)a4);
return v9;
}Referenced by:
No references.