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.