PnpDriverLoadingFailed
NTSTATUS __fastcall PnpDriverLoadingFailed(VOID *Handle, _UNICODE_STRING *ServiceKeyName, __int64 a3, INT64 a4){
int v4;
VOID *v6;
NTSTATUS result;
unsigned int v8;
NTSTATUS RegistryValue;
unsigned int v10;
_ADAPTER_OBJECT *v11;
_ADAPTER_OBJECT *v12;
__int64 v13;
PDEVICE_NODE v14;
_ETHREAD *CurrentThread;
__int64 v16;
int v17;
_ETHREAD *v18;
int v19;
unsigned int i;
__int64 v21;
_OBJECT_TYPE *v22;
_KEY_VALUE_FULL_INFORMATION *v23;
__int64 v24;
INT64 CreateEnum;
VOID **CreateEnuma;
UINT64 DataSize;
UINT64 DataSizea;
UINT64 DataSizeb;
UINT64 DataSizec;
INT64 v31;
INT64 v32;
_UNICODE_STRING ValueName;
VOID *KeyHandle;
unsigned int v35;
int v36;
_KEY_VALUE_FULL_INFORMATION *Information;
VOID *ServiceHandle;
int Data;
_NTSTRSAFE_PWSTR ppszDestEnd[2];
_NTSTRSAFE_PWSTR v41[2];
_UNICODE_STRING DeviceInstanceRegistryPath;
_OBJECT_ATTRIBUTES ObjectAttributes;
__int16 pszDest[20];
Information = 0i64;
v4 = 0;
KeyHandle = 0i64;
*(_DWORD *)(&ValueName.MaximumLength + 1) = 0;
ServiceHandle = Handle;
v6 = Handle;
v36 = 0;
DeviceInstanceRegistryPath = 0i64;
if( Handle )
{
*(&ObjectAttributes.Length + 1) = 0;
memset(&ObjectAttributes.Attributes + 1, 0, 20);
ValueName.Buffer = (wchar_t *)&stru_1407D01E0._Xmm7;
ObjectAttributes.RootDirectory = Handle;
ObjectAttributes.ObjectName = &ValueName;
*(_DWORD *)&ValueName.Length = 655368;
ObjectAttributes.Length = 48;
ObjectAttributes.Attributes = 576;
result = ZwOpenKey(&KeyHandle, 0x20019ui64, &ObjectAttributes, a4, CreateEnum, DataSize, v31, v32);
}
else
{
result = PipOpenServiceEnumKeys(ServiceKeyName, 0x20019ui64, &ServiceHandle, &KeyHandle, 0);
v6 = ServiceHandle;
v4 = 1;
v36 = 1;
}
if( result >= 0 )
{
ValueName.Buffer = (wchar_t *)&stru_1407D01E0._Xmm13;
*(_DWORD *)&ValueName.Length = 2097182;
LODWORD(DataSize) = 4;
Data = 1;
ZwSetValueKey(KeyHandle, &ValueName, 0i64, 4ui64, &Data, DataSize);
v8 = 0;
RegistryValue = IopGetRegistryValue(KeyHandle, (PWCHAR)&stru_1407D01E0._Xmm8, 0i64, &Information);
if( RegistryValue < 0 )
goto LABEL_44;
if( Information->Type == 4 && Information->DataLength >= 4 )
v8 = *(ULONG *)((char *)&Information->TitleIndex + Information->DataOffset);
ExFreePoolWithTag(Information, 0);
if( v8 )
{
v10 = 0;
v35 = v8;
do
{
if( PipServiceInstanceToDeviceInstance(
v6,
ServiceKeyName,
v10,
&DeviceInstanceRegistryPath,
CreateEnuma,
DataSizea) >= 0 )
{
v11 = (_ADAPTER_OBJECT *)PnpDeviceObjectFromDeviceInstanceWithTag(
(__int64)&DeviceInstanceRegistryPath,
0x746C6644u);
v12 = v11;
if( v11 )
{
v13 = *(_QWORD *)(v11->ExpiredLock._bf_0 + 40);
if( v13 )
{
if( !PipIsDevNodeDNStarted(v13) )
IopReleaseDeviceResources(v14, 1u);
}
}
CurrentThread = (_ETHREAD *)KeGetCurrentThread();
--CurrentThread->Tcb.KernelApcDisable;
ExAcquireResourceSharedLite((UINT64)&PnpReplaceEvent + 6688, 1);
if( v12 )
{
v16 = *(_QWORD *)(v12->ExpiredLock._bf_0 + 40);
if( v16 && (*(_DWORD *)(v16 + 396) & 1) != 0 && (unsigned int)(*(_DWORD *)(v16 + 300) - 775) <= 1 )
{
PoFxAbandonDevice((_DEVICE_NODE *)v16);
PipSetDevNodeState((_DEVICE_NODE *)v16, DeviceNodeRemoved);
PipSetDevNodeProblem((_DEVICE_NODE *)v16, 0x18ui64, 0);
}
HalPutDmaAdapter(v12);
}
ExFreePoolWithTag(DeviceInstanceRegistryPath.Buffer, 0);
ExReleaseResourceLite((PERESOURCE)((char *)&PnpReplaceEvent + 6688));
KeLeaveCriticalRegionThread(KeGetCurrentThread());
v6 = ServiceHandle;
}
++v10;
}
while( v10 < v8 );
v17 = v36;
if( v35 != v8 )
{
v18 = (_ETHREAD *)KeGetCurrentThread();
--v18->Tcb.KernelApcDisable;
ExAcquireResourceSharedLite((UINT64)&PnpReplaceEvent + 6688, 1);
if( v35 )
{
v19 = 0;
for( i = 0; i < v8; ++i )
{
*(_QWORD *)ppszDestEnd = pszDest;
RtlStringCchPrintfExW((WCHAR *)pszDest, 0xAui64, (WCHAR **)ppszDestEnd, 0i64, 0i64, (WCHAR *)L"%u");
ValueName.MaximumLength = 20;
v21 = (__int64)(*(_QWORD *)ppszDestEnd - (_QWORD)pszDest) >> 1;
if( (_DWORD)v21 == -1 )
ValueName.Length = 20;
else
ValueName.Length = 2 * v21;
ValueName.Buffer = (wchar_t *)pszDest;
if( IopGetRegistryValue(KeyHandle, (PWCHAR)pszDest, 0i64, &Information) >= 0 )
{
v23 = Information;
if( i != v19 )
{
ZwDeleteValueKey(KeyHandle, &ValueName, v22);
*(_QWORD *)v41 = pszDest;
RtlStringCchPrintfExW((WCHAR *)pszDest, 0xAui64, (WCHAR **)v41, 0i64, 0i64, (WCHAR *)L"%u");
ValueName.MaximumLength = 20;
v24 = (__int64)(*(_QWORD *)v41 - (_QWORD)pszDest) >> 1;
if( (_DWORD)v24 == -1 )
ValueName.Length = 20;
else
ValueName.Length = 2 * v24;
ValueName.Buffer = (wchar_t *)pszDest;
LODWORD(DataSizeb) = v23->DataLength;
ZwSetValueKey(KeyHandle, &ValueName, 0i64, 1ui64, (char *)v23 + v23->DataOffset, DataSizeb);
}
ExFreePoolWithTag(v23, 0);
++v19;
}
}
v17 = v36;
}
ValueName.Buffer = (wchar_t *)&stru_1407D01E0._Xmm8;
*(_DWORD *)&ValueName.Length = 786442;
LODWORD(DataSizea) = 4;
ZwSetValueKey(KeyHandle, &ValueName, 0i64, 4ui64, &v35, DataSizea);
ValueName.Buffer = (wchar_t *)&stru_1407D01E0._Xmm15;
LODWORD(DataSizec) = 4;
*(_DWORD *)&ValueName.Length = 1703960;
ZwSetValueKey(KeyHandle, &ValueName, 0i64, 4ui64, &v35, DataSizec);
ExReleaseResourceLite((PERESOURCE)((char *)&PnpReplaceEvent + 6688));
KeLeaveCriticalRegionThread(KeGetCurrentThread());
LODWORD(v6) = (_DWORD)ServiceHandle;
}
ZwClose((_HANDLE)KeyHandle);
if( v17 )
ZwClose((_HANDLE)v6);
return 0;
}
else
{
LABEL_44:
ZwClose((_HANDLE)KeyHandle);
if( v4 )
ZwClose((_HANDLE)v6);
return RegistryValue;
}
}
return result;
}Referenced by:
IopInitializeBuiltinDriver
IopLoadDriver