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.