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.