CmGetDeviceSoftwareKey
NTSTATUS __stdcall CmGetDeviceSoftwareKey(
HPNPCTX *hPnpCtx,
const WCHAR *DeviceInstanceId,
WCHAR *SoftwareKeyPath,
UINT64 SoftwareKeyPathLength,
INT64 Create){
int DeviceRegProp;
INT64 v9;
_ETHREAD *CurrentThread;
NTSTATUS v12;
UINT64 v13;
UINT8 v14;
UINT64 v15;
__int64 v16;
VOID *v17;
VOID **CmRegPropType;
UINT64 *CmRegPropTypea;
UINT64 *CmRegPropTypeb;
UINT64 *CmRegPropTypec;
UINT64 *PropertyBuffer;
UINT64 *PropertySize;
UINT64 Flags;
UINT64 Flagsa;
UINT64 Flagsb;
WCHAR *Flagsc;
UINT64 v28;
VOID *BaseKeyHandle;
VOID *InstanceKeyHandle;
_UNICODE_STRING DestinationString;
WCHAR InstanceKeyPath[12];
UINT8 v33[76];
__int16 v34;
v28 = 88i64;
LODWORD(Flags) = 0;
BaseKeyHandle = 0i64;
InstanceKeyHandle = 0i64;
DestinationString = 0i64;
DeviceRegProp = CmGetDeviceRegProp(
hPnpCtx,
DeviceInstanceId,
0i64,
10i64,
(UINT64 *)((char *)&v28 + 4),
(UINT8 *)SoftwareKeyPath,
&v28,
Flags);
if( DeviceRegProp == -1073741275 )
{
if( (_BYTE)Create == 1 )
{
CurrentThread = (_ETHREAD *)KeGetCurrentThread();
--CurrentThread->Tcb.KernelApcDisable;
ExAcquireResourceExclusiveLite(*((_QWORD *)hPnpCtx + 30), 1, v9);
LODWORD(Flagsa) = 0;
v28 = 88i64;
DeviceRegProp = CmGetDeviceRegProp(
hPnpCtx,
DeviceInstanceId,
0i64,
10i64,
(UINT64 *)((char *)&v28 + 4),
(UINT8 *)SoftwareKeyPath,
&v28,
Flagsa);
if( DeviceRegProp == -1073741275 )
{
LODWORD(Flagsb) = 0;
v28 = 78i64;
v12 = CmGetDeviceRegProp(hPnpCtx, DeviceInstanceId, 0i64, 9i64, (UINT64 *)((char *)&v28 + 4), v33, &v28, Flagsb);
DeviceRegProp = v12;
if( v12 == -1073741275 )
{
DeviceRegProp = -1073741772;
}
else if( v12 >= 0 )
{
LOBYTE(PropertyBuffer) = 0;
LODWORD(CmRegPropType) = 131103;
v34 = 0;
DeviceRegProp = CmOpenInstallerClassRegKey(hPnpCtx, (WCHAR *)v33, v13, v14, CmRegPropType, PropertyBuffer);
if( DeviceRegProp >= 0 )
{
DeviceRegProp = CmCreateOrdinalInstanceKey(
hPnpCtx,
BaseKeyHandle,
InstanceKeyPath,
v15,
(UINT64)CmRegPropTypea,
&InstanceKeyHandle);
if( DeviceRegProp >= 0 )
{
Flagsc = InstanceKeyPath;
PropertySize = (UINT64 *)v33;
LODWORD(CmRegPropTypeb) = 2048;
DeviceRegProp = RtlStringCchPrintfExW(
SoftwareKeyPath,
0x2Cui64,
0i64,
0i64,
(UINT64)CmRegPropTypeb,
(WCHAR *)L"%s\\%s");
if( DeviceRegProp >= 0 )
{
DeviceRegProp = RtlInitUnicodeStringEx(&DestinationString, SoftwareKeyPath);
if( DeviceRegProp >= 0 )
{
LODWORD(Flagsc) = 0;
LODWORD(PropertySize) = DestinationString.MaximumLength;
LODWORD(CmRegPropTypec) = 1;
DeviceRegProp = CmSetDeviceRegProp(
hPnpCtx,
(WCHAR *)DeviceInstanceId,
0i64,
CM_REG_PROP_DRIVER,
(UINT64)CmRegPropTypec,
(UINT8 *)DestinationString.Buffer,
(UINT64)PropertySize,
(UINT64)Flagsc);
if( DeviceRegProp < 0 )
{
v16 = *((_QWORD *)hPnpCtx + 28);
if( v16 )
v17 = *(VOID **)(v16 + 8);
else
v17 = 0i64;
RegRtlDeleteKeyTransacted(BaseKeyHandle, InstanceKeyPath, v17);
}
}
}
}
}
}
}
ExReleaseResourceLite(*((PERESOURCE *)hPnpCtx + 30));
KeLeaveCriticalRegion();
if( InstanceKeyHandle )
ZwClose((_HANDLE)InstanceKeyHandle);
}
else
{
DeviceRegProp = -1073741772;
}
}
if( BaseKeyHandle )
ZwClose((_HANDLE)BaseKeyHandle);
return DeviceRegProp;
}Referenced by:
CmGetDeviceSoftwareKeyPath