HalpDispatchPnp
NTSTATUS __stdcall HalpDispatchPnp(_DEVICE_OBJECT *DeviceObject, _IRP *Irp){
_DWORD *DeviceExtension;
_IO_STACK_LOCATION *CurrentStackLocation;
unsigned int MinorFunction;
unsigned int v7;
NTSTATUS DeviceRelations;
int Status;
unsigned int v11;
unsigned int v12;
unsigned int v13;
unsigned int v14;
unsigned int v15;
_IO_SECURITY_CONTEXT *SecurityContext;
unsigned int v17;
int Interface;
unsigned int ActiveProcessorCount;
unsigned int i;
int v21;
unsigned int v22;
unsigned int v23;
unsigned int v24;
unsigned int v25;
unsigned int v26;
UINT64 InterfaceBufferSize;
DeviceExtension = DeviceObject->DeviceExtension;
CurrentStackLocation = Irp->Tail.CurrentStackLocation;
if( *DeviceExtension == 192 )
{
MinorFunction = CurrentStackLocation->MinorFunction;
if( MinorFunction <= 7 )
{
if( MinorFunction == 7 )
{
DeviceRelations = HalpQueryDeviceRelations(
DeviceObject,
(_DEVICE_RELATION_TYPE)CurrentStackLocation->Parameters.SecurityContext,
(_DEVICE_RELATIONS **)&Irp->IoStatus.Information);
goto LABEL_5;
}
Status = 0;
if( !CurrentStackLocation->MinorFunction )
{
if( DeviceExtension[8] == 129 )
{
HalpInitializeLateSystemActions();
ActiveProcessorCount = KeQueryActiveProcessorCountEx(0xFFFFu);
for( i = 0; i < ActiveProcessorCount; ++i )
HalpAllocateCR3Root(i);
HalpInitSystemHelper(HalInitPhaseAcpiPdoStarted, HalInitPhaseAcpiPdoStartedEnd, 0i64);
}
goto LABEL_16;
}
v22 = MinorFunction - 1;
if( !v22 )
{
Status = -1073741823;
goto LABEL_16;
}
v23 = v22 - 1;
if( !v23 )
goto LABEL_16;
v24 = v23 - 1;
if( !v24 )
goto LABEL_16;
v25 = v24 - 1;
if( !v25 )
goto LABEL_16;
v26 = v25 - 1;
if( !v26 || v26 == 1 )
goto LABEL_16;
}
else
{
v7 = MinorFunction - 8;
if( !v7 )
{
LODWORD(InterfaceBufferSize) = LOWORD(CurrentStackLocation->Parameters.Options);
DeviceRelations = HalpQueryInterface(
DeviceObject,
(_GUID *)CurrentStackLocation->Parameters.SecurityContext,
(VOID *)HIWORD(CurrentStackLocation->Parameters.Options),
*(VOID **)&CurrentStackLocation->Parameters.EaLength,
InterfaceBufferSize,
*(_INTERFACE **)&CurrentStackLocation->Parameters.FileAttributes,
&Irp->IoStatus.Information);
LABEL_5:
Status = DeviceRelations;
goto LABEL_6;
}
v11 = v7 - 1;
if( !v11 )
{
SecurityContext = CurrentStackLocation->Parameters.SecurityContext;
if( WORD1(SecurityContext->SecurityQos) != 1 )
goto LABEL_7;
v17 = HIDWORD(SecurityContext->SecurityQos) & 0xFFFFFEC3;
SecurityContext->FullCreateOptions = 1;
HIDWORD(SecurityContext->SecurityQos) = v17 | 0xC0;
Status = 0;
LODWORD(SecurityContext->AccessState) = -1;
HIDWORD(SecurityContext->AccessState) = -1;
HIDWORD(SecurityContext[1].AccessState) = 4;
SecurityContext[1].DesiredAccess = 4;
*(_SECURITY_QUALITY_OF_SERVICE **)((char *)&SecurityContext[2].SecurityQos + 4) = 0i64;
HIDWORD(SecurityContext[2].AccessState) = 0;
goto LABEL_16;
}
v12 = v11 - 1;
if( !v12 )
{
DeviceRelations = HalpQueryResources(DeviceObject, (_CM_RESOURCE_LIST **)&Irp->IoStatus.Information);
goto LABEL_5;
}
v13 = v12 - 1;
if( v13 )
{
v14 = v13 - 8;
if( !v14 )
{
DeviceRelations = HalpQueryIdPdo(
DeviceObject,
(_BUS_QUERY_ID_TYPE)CurrentStackLocation->Parameters.SecurityContext,
(WCHAR **)&Irp->IoStatus.Information);
goto LABEL_5;
}
v15 = v14 - 1;
if( !v15 || v15 == 2 )
{
LABEL_15:
Status = 0;
goto LABEL_16;
}
}
else
{
v21 = DeviceExtension[8];
if( v21 == 129 )
{
DeviceRelations = HalpQueryAcpiResourceRequirements((_IO_RESOURCE_REQUIREMENTS_LIST **)&Irp->IoStatus.Information);
goto LABEL_5;
}
if( (unsigned int)(v21 - 130) <= 1 )
goto LABEL_15;
}
}
Status = -1073741637;
LABEL_6:
if( Status == -1073741637 )
{
LABEL_7:
Status = Irp->IoStatus.Status;
LABEL_8:
IofCompleteRequest(Irp, 0);
return Status;
}
LABEL_16:
Irp->IoStatus.Status = Status;
goto LABEL_8;
}
if( *DeviceExtension != 193 )
{
Status = -1073741808;
goto LABEL_6;
}
switch( CurrentStackLocation->MinorFunction )
{
case 7u:
Interface = HalpQueryDeviceRelations(
DeviceObject,
(_DEVICE_RELATION_TYPE)CurrentStackLocation->Parameters.SecurityContext,
(_DEVICE_RELATIONS **)&Irp->IoStatus.Information);
break;
case 8u:
LODWORD(InterfaceBufferSize) = LOWORD(CurrentStackLocation->Parameters.Options);
Interface = HalpQueryInterface(
DeviceObject,
(_GUID *)CurrentStackLocation->Parameters.SecurityContext,
(VOID *)HIWORD(CurrentStackLocation->Parameters.Options),
*(VOID **)&CurrentStackLocation->Parameters.EaLength,
InterfaceBufferSize,
*(_INTERFACE **)&CurrentStackLocation->Parameters.FileAttributes,
&Irp->IoStatus.Information);
break;
case 0x13u:
Interface = HalpQueryIdFdo(
(_DEVICE_OBJECT *)((unsigned int)CurrentStackLocation->MinorFunction - 8),
(_BUS_QUERY_ID_TYPE)CurrentStackLocation->Parameters.SecurityContext,
(WCHAR **)&Irp->IoStatus.Information);
break;
default:
return HalpPassIrpFromFdoToPdo(DeviceObject, Irp);
}
Status = Interface;
if( (int)(Interface + 0x80000000) >= 0 && Interface != -1073741637 )
goto LABEL_16;
if( Interface != -1073741637 )
Irp->IoStatus.Status = Interface;
return HalpPassIrpFromFdoToPdo(DeviceObject, Irp);
}Referenced by:
No references.