PiCMOpenDeviceInterfaceKey
NTSTATUS __stdcall PiCMOpenDeviceInterfaceKey(
VOID *IoctlInputBuffer,
UINT64 IoctlInputBufferSize,
VOID *IoctlOutputBuffer,
UINT64 IoctlOutputBufferSize,
UINT64 *BytesUsed){
UINT64 *v5;
unsigned int v6;
char PreviousMode;
NTSTATUS v9;
UINT64 v10;
const WCHAR *v11;
unsigned int v12;
UINT64 v13;
NTSTATUS v14;
UINT64 v15;
NTSTATUS v16;
VOID **DesiredAccess;
INT64 Create;
INT64 Createa;
VOID **DeviceInterfaceKey;
UINT64 *Disposition;
VOID *Handle;
__int128 v24;
INT64 v25[2];
UINT64 ExpectedOutputSize[2];
PVOID SourceHandle;
v5 = (UINT64 *)SourceHandle;
v6 = IoctlOutputBufferSize;
Handle = 0i64;
SourceHandle = 0i64;
*(_DWORD *)v5 = 0;
v24 = 0i64;
*(_OWORD *)v25 = 0i64;
PreviousMode = KeGetCurrentThread()->PreviousMode;
*(_OWORD *)ExpectedOutputSize = 0i64;
v9 = PiCMCaptureRegistryInputData(IoctlInputBuffer, IoctlInputBufferSize, (int)BytesUsed, (__int64)&v24);
if( v9 < 0 )
goto LABEL_21;
v11 = (const WCHAR *)v25[0];
if( !v25[0]
|| *(_QWORD *)((char *)&v24 + 4) != 0x400000000i64
|| HIDWORD(ExpectedOutputSize[0])
|| !IoctlOutputBuffer
|| v6 < 0x10 )
{
v14 = -1073741811;
goto LABEL_15;
}
v12 = HIDWORD(v25[1]);
LOBYTE(Create) = 0;
LODWORD(DesiredAccess) = HIDWORD(v25[1]);
v14 = CmOpenDeviceInterfaceRegKey(
*(&stru_140CF2E80 + 607),
(const WCHAR *)v25[0],
50i64,
v10,
(INT64)DesiredAccess,
Create,
&SourceHandle,
0i64);
if( v14 != -1073741772 )
goto LABEL_12;
if( LODWORD(ExpectedOutputSize[0]) == 1 )
{
if( !PiAuDoesClientHaveAccess(2ui64) )
{
v14 = -1073741790;
goto LABEL_15;
}
LOBYTE(Createa) = 1;
LODWORD(DesiredAccess) = v12;
v14 = CmOpenDeviceInterfaceRegKey(
*(&stru_140CF2E80 + 607),
v11,
50i64,
v15,
(INT64)DesiredAccess,
Createa,
&SourceHandle,
0i64);
LABEL_12:
if( v14 >= 0 )
{
DesiredAccess = &Handle;
PiCMDuplicateRegistryHandle(SourceHandle, v13, (UINT64 *)v12, PreviousMode);
v14 = v16;
}
}
LABEL_15:
LODWORD(DesiredAccess) = v6;
v9 = PiCMReturnHandleResultData(
(unsigned int)v14,
Handle,
LODWORD(ExpectedOutputSize[1]),
IoctlOutputBuffer,
(UINT64)DesiredAccess,
v5,
(INT64)DeviceInterfaceKey,
(INT64)Disposition);
if( SourceHandle )
ZwClose((_HANDLE)SourceHandle);
if( v9 < 0 || v14 < 0 )
{
if( Handle )
ObCloseHandle(Handle, PreviousMode);
}
LABEL_21:
PiCMReleaseRegistryInputData((__int64)&v24);
return v9;
}Referenced by:
PiCMHandleIoctl