mirror of
https://github.com/reactos/reactos.git
synced 2025-02-22 16:36:33 +00:00
[NTOS:IO] Fix indentation. No code changes!
This commit is contained in:
parent
cf7981fe4e
commit
9538c3ccd7
1 changed files with 399 additions and 390 deletions
|
@ -14,42 +14,44 @@
|
|||
|
||||
static
|
||||
BOOLEAN
|
||||
IopCheckDescriptorForConflict(PCM_PARTIAL_RESOURCE_DESCRIPTOR CmDesc, OPTIONAL PCM_PARTIAL_RESOURCE_DESCRIPTOR ConflictingDescriptor)
|
||||
IopCheckDescriptorForConflict(
|
||||
PCM_PARTIAL_RESOURCE_DESCRIPTOR CmDesc,
|
||||
OPTIONAL PCM_PARTIAL_RESOURCE_DESCRIPTOR ConflictingDescriptor)
|
||||
{
|
||||
CM_RESOURCE_LIST CmList;
|
||||
NTSTATUS Status;
|
||||
CM_RESOURCE_LIST CmList;
|
||||
NTSTATUS Status;
|
||||
|
||||
CmList.Count = 1;
|
||||
CmList.List[0].InterfaceType = InterfaceTypeUndefined;
|
||||
CmList.List[0].BusNumber = 0;
|
||||
CmList.List[0].PartialResourceList.Version = 1;
|
||||
CmList.List[0].PartialResourceList.Revision = 1;
|
||||
CmList.List[0].PartialResourceList.Count = 1;
|
||||
CmList.List[0].PartialResourceList.PartialDescriptors[0] = *CmDesc;
|
||||
CmList.Count = 1;
|
||||
CmList.List[0].InterfaceType = InterfaceTypeUndefined;
|
||||
CmList.List[0].BusNumber = 0;
|
||||
CmList.List[0].PartialResourceList.Version = 1;
|
||||
CmList.List[0].PartialResourceList.Revision = 1;
|
||||
CmList.List[0].PartialResourceList.Count = 1;
|
||||
CmList.List[0].PartialResourceList.PartialDescriptors[0] = *CmDesc;
|
||||
|
||||
Status = IopDetectResourceConflict(&CmList, TRUE, ConflictingDescriptor);
|
||||
if (Status == STATUS_CONFLICTING_ADDRESSES)
|
||||
return TRUE;
|
||||
Status = IopDetectResourceConflict(&CmList, TRUE, ConflictingDescriptor);
|
||||
if (Status == STATUS_CONFLICTING_ADDRESSES)
|
||||
return TRUE;
|
||||
|
||||
return FALSE;
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
static
|
||||
BOOLEAN
|
||||
IopFindBusNumberResource(
|
||||
IN PIO_RESOURCE_DESCRIPTOR IoDesc,
|
||||
OUT PCM_PARTIAL_RESOURCE_DESCRIPTOR CmDesc)
|
||||
IN PIO_RESOURCE_DESCRIPTOR IoDesc,
|
||||
OUT PCM_PARTIAL_RESOURCE_DESCRIPTOR CmDesc)
|
||||
{
|
||||
ULONG Start;
|
||||
CM_PARTIAL_RESOURCE_DESCRIPTOR ConflictingDesc;
|
||||
ULONG Start;
|
||||
CM_PARTIAL_RESOURCE_DESCRIPTOR ConflictingDesc;
|
||||
|
||||
ASSERT(IoDesc->Type == CmDesc->Type);
|
||||
ASSERT(IoDesc->Type == CmResourceTypeBusNumber);
|
||||
ASSERT(IoDesc->Type == CmDesc->Type);
|
||||
ASSERT(IoDesc->Type == CmResourceTypeBusNumber);
|
||||
|
||||
for (Start = IoDesc->u.BusNumber.MinBusNumber;
|
||||
Start <= IoDesc->u.BusNumber.MaxBusNumber - IoDesc->u.BusNumber.Length + 1;
|
||||
Start++)
|
||||
{
|
||||
for (Start = IoDesc->u.BusNumber.MinBusNumber;
|
||||
Start <= IoDesc->u.BusNumber.MaxBusNumber - IoDesc->u.BusNumber.Length + 1;
|
||||
Start++)
|
||||
{
|
||||
CmDesc->u.BusNumber.Length = IoDesc->u.BusNumber.Length;
|
||||
CmDesc->u.BusNumber.Start = Start;
|
||||
|
||||
|
@ -62,30 +64,31 @@ IopFindBusNumberResource(
|
|||
DPRINT1("Satisfying bus number requirement with 0x%x (length: 0x%x)\n", Start, CmDesc->u.BusNumber.Length);
|
||||
return TRUE;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return FALSE;
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
static
|
||||
BOOLEAN
|
||||
IopFindMemoryResource(
|
||||
IN PIO_RESOURCE_DESCRIPTOR IoDesc,
|
||||
OUT PCM_PARTIAL_RESOURCE_DESCRIPTOR CmDesc)
|
||||
IN PIO_RESOURCE_DESCRIPTOR IoDesc,
|
||||
OUT PCM_PARTIAL_RESOURCE_DESCRIPTOR CmDesc)
|
||||
{
|
||||
ULONGLONG Start;
|
||||
CM_PARTIAL_RESOURCE_DESCRIPTOR ConflictingDesc;
|
||||
ULONGLONG Start;
|
||||
CM_PARTIAL_RESOURCE_DESCRIPTOR ConflictingDesc;
|
||||
|
||||
ASSERT(IoDesc->Type == CmDesc->Type);
|
||||
ASSERT(IoDesc->Type == CmResourceTypeMemory);
|
||||
ASSERT(IoDesc->Type == CmDesc->Type);
|
||||
ASSERT(IoDesc->Type == CmResourceTypeMemory);
|
||||
|
||||
/* HACK */
|
||||
if (IoDesc->u.Memory.Alignment == 0) IoDesc->u.Memory.Alignment = 1;
|
||||
/* HACK */
|
||||
if (IoDesc->u.Memory.Alignment == 0)
|
||||
IoDesc->u.Memory.Alignment = 1;
|
||||
|
||||
for (Start = (ULONGLONG)IoDesc->u.Memory.MinimumAddress.QuadPart;
|
||||
Start <= (ULONGLONG)IoDesc->u.Memory.MaximumAddress.QuadPart - IoDesc->u.Memory.Length + 1;
|
||||
Start += IoDesc->u.Memory.Alignment)
|
||||
{
|
||||
for (Start = (ULONGLONG)IoDesc->u.Memory.MinimumAddress.QuadPart;
|
||||
Start <= (ULONGLONG)IoDesc->u.Memory.MaximumAddress.QuadPart - IoDesc->u.Memory.Length + 1;
|
||||
Start += IoDesc->u.Memory.Alignment)
|
||||
{
|
||||
CmDesc->u.Memory.Length = IoDesc->u.Memory.Length;
|
||||
CmDesc->u.Memory.Start.QuadPart = (LONGLONG)Start;
|
||||
|
||||
|
@ -99,30 +102,31 @@ IopFindMemoryResource(
|
|||
DPRINT1("Satisfying memory requirement with 0x%I64x (length: 0x%x)\n", Start, CmDesc->u.Memory.Length);
|
||||
return TRUE;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return FALSE;
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
static
|
||||
BOOLEAN
|
||||
IopFindPortResource(
|
||||
IN PIO_RESOURCE_DESCRIPTOR IoDesc,
|
||||
OUT PCM_PARTIAL_RESOURCE_DESCRIPTOR CmDesc)
|
||||
IN PIO_RESOURCE_DESCRIPTOR IoDesc,
|
||||
OUT PCM_PARTIAL_RESOURCE_DESCRIPTOR CmDesc)
|
||||
{
|
||||
ULONGLONG Start;
|
||||
CM_PARTIAL_RESOURCE_DESCRIPTOR ConflictingDesc;
|
||||
ULONGLONG Start;
|
||||
CM_PARTIAL_RESOURCE_DESCRIPTOR ConflictingDesc;
|
||||
|
||||
ASSERT(IoDesc->Type == CmDesc->Type);
|
||||
ASSERT(IoDesc->Type == CmResourceTypePort);
|
||||
ASSERT(IoDesc->Type == CmDesc->Type);
|
||||
ASSERT(IoDesc->Type == CmResourceTypePort);
|
||||
|
||||
/* HACK */
|
||||
if (IoDesc->u.Port.Alignment == 0) IoDesc->u.Port.Alignment = 1;
|
||||
/* HACK */
|
||||
if (IoDesc->u.Port.Alignment == 0)
|
||||
IoDesc->u.Port.Alignment = 1;
|
||||
|
||||
for (Start = (ULONGLONG)IoDesc->u.Port.MinimumAddress.QuadPart;
|
||||
Start <= (ULONGLONG)IoDesc->u.Port.MaximumAddress.QuadPart - IoDesc->u.Port.Length + 1;
|
||||
Start += IoDesc->u.Port.Alignment)
|
||||
{
|
||||
for (Start = (ULONGLONG)IoDesc->u.Port.MinimumAddress.QuadPart;
|
||||
Start <= (ULONGLONG)IoDesc->u.Port.MaximumAddress.QuadPart - IoDesc->u.Port.Length + 1;
|
||||
Start += IoDesc->u.Port.Alignment)
|
||||
{
|
||||
CmDesc->u.Port.Length = IoDesc->u.Port.Length;
|
||||
CmDesc->u.Port.Start.QuadPart = (LONGLONG)Start;
|
||||
|
||||
|
@ -135,27 +139,27 @@ IopFindPortResource(
|
|||
DPRINT("Satisfying port requirement with 0x%I64x (length: 0x%x)\n", Start, CmDesc->u.Port.Length);
|
||||
return TRUE;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
DPRINT1("IopFindPortResource failed!\n");
|
||||
return FALSE;
|
||||
DPRINT1("IopFindPortResource failed!\n");
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
static
|
||||
BOOLEAN
|
||||
IopFindDmaResource(
|
||||
IN PIO_RESOURCE_DESCRIPTOR IoDesc,
|
||||
OUT PCM_PARTIAL_RESOURCE_DESCRIPTOR CmDesc)
|
||||
IN PIO_RESOURCE_DESCRIPTOR IoDesc,
|
||||
OUT PCM_PARTIAL_RESOURCE_DESCRIPTOR CmDesc)
|
||||
{
|
||||
ULONG Channel;
|
||||
ULONG Channel;
|
||||
|
||||
ASSERT(IoDesc->Type == CmDesc->Type);
|
||||
ASSERT(IoDesc->Type == CmResourceTypeDma);
|
||||
ASSERT(IoDesc->Type == CmDesc->Type);
|
||||
ASSERT(IoDesc->Type == CmResourceTypeDma);
|
||||
|
||||
for (Channel = IoDesc->u.Dma.MinimumChannel;
|
||||
Channel <= IoDesc->u.Dma.MaximumChannel;
|
||||
Channel++)
|
||||
{
|
||||
for (Channel = IoDesc->u.Dma.MinimumChannel;
|
||||
Channel <= IoDesc->u.Dma.MaximumChannel;
|
||||
Channel++)
|
||||
{
|
||||
CmDesc->u.Dma.Channel = Channel;
|
||||
CmDesc->u.Dma.Port = 0;
|
||||
|
||||
|
@ -164,26 +168,26 @@ IopFindDmaResource(
|
|||
DPRINT1("Satisfying DMA requirement with channel 0x%x\n", Channel);
|
||||
return TRUE;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return FALSE;
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
static
|
||||
BOOLEAN
|
||||
IopFindInterruptResource(
|
||||
IN PIO_RESOURCE_DESCRIPTOR IoDesc,
|
||||
OUT PCM_PARTIAL_RESOURCE_DESCRIPTOR CmDesc)
|
||||
IN PIO_RESOURCE_DESCRIPTOR IoDesc,
|
||||
OUT PCM_PARTIAL_RESOURCE_DESCRIPTOR CmDesc)
|
||||
{
|
||||
ULONG Vector;
|
||||
ULONG Vector;
|
||||
|
||||
ASSERT(IoDesc->Type == CmDesc->Type);
|
||||
ASSERT(IoDesc->Type == CmResourceTypeInterrupt);
|
||||
ASSERT(IoDesc->Type == CmDesc->Type);
|
||||
ASSERT(IoDesc->Type == CmResourceTypeInterrupt);
|
||||
|
||||
for (Vector = IoDesc->u.Interrupt.MinimumVector;
|
||||
Vector <= IoDesc->u.Interrupt.MaximumVector;
|
||||
Vector++)
|
||||
{
|
||||
for (Vector = IoDesc->u.Interrupt.MinimumVector;
|
||||
Vector <= IoDesc->u.Interrupt.MaximumVector;
|
||||
Vector++)
|
||||
{
|
||||
CmDesc->u.Interrupt.Vector = Vector;
|
||||
CmDesc->u.Interrupt.Level = Vector;
|
||||
CmDesc->u.Interrupt.Affinity = (KAFFINITY)-1;
|
||||
|
@ -193,15 +197,15 @@ IopFindInterruptResource(
|
|||
DPRINT1("Satisfying interrupt requirement with IRQ 0x%x\n", Vector);
|
||||
return TRUE;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return FALSE;
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
NTSTATUS NTAPI
|
||||
IopFixupResourceListWithRequirements(
|
||||
IN PIO_RESOURCE_REQUIREMENTS_LIST RequirementsList,
|
||||
OUT PCM_RESOURCE_LIST *ResourceList)
|
||||
IN PIO_RESOURCE_REQUIREMENTS_LIST RequirementsList,
|
||||
OUT PCM_RESOURCE_LIST *ResourceList)
|
||||
{
|
||||
ULONG i, OldCount;
|
||||
BOOLEAN AlternateRequired = FALSE;
|
||||
|
@ -537,388 +541,393 @@ IopFixupResourceListWithRequirements(
|
|||
static
|
||||
BOOLEAN
|
||||
IopCheckResourceDescriptor(
|
||||
IN PCM_PARTIAL_RESOURCE_DESCRIPTOR ResDesc,
|
||||
IN PCM_RESOURCE_LIST ResourceList,
|
||||
IN BOOLEAN Silent,
|
||||
OUT OPTIONAL PCM_PARTIAL_RESOURCE_DESCRIPTOR ConflictingDescriptor)
|
||||
IN PCM_PARTIAL_RESOURCE_DESCRIPTOR ResDesc,
|
||||
IN PCM_RESOURCE_LIST ResourceList,
|
||||
IN BOOLEAN Silent,
|
||||
OUT OPTIONAL PCM_PARTIAL_RESOURCE_DESCRIPTOR ConflictingDescriptor)
|
||||
{
|
||||
ULONG i, ii;
|
||||
BOOLEAN Result = FALSE;
|
||||
ULONG i, ii;
|
||||
BOOLEAN Result = FALSE;
|
||||
|
||||
for (i = 0; i < ResourceList->Count; i++)
|
||||
{
|
||||
PCM_PARTIAL_RESOURCE_LIST ResList = &ResourceList->List[i].PartialResourceList;
|
||||
for (ii = 0; ii < ResList->Count; ii++)
|
||||
{
|
||||
PCM_PARTIAL_RESOURCE_DESCRIPTOR ResDesc2 = &ResList->PartialDescriptors[ii];
|
||||
for (i = 0; i < ResourceList->Count; i++)
|
||||
{
|
||||
PCM_PARTIAL_RESOURCE_LIST ResList = &ResourceList->List[i].PartialResourceList;
|
||||
for (ii = 0; ii < ResList->Count; ii++)
|
||||
{
|
||||
PCM_PARTIAL_RESOURCE_DESCRIPTOR ResDesc2 = &ResList->PartialDescriptors[ii];
|
||||
|
||||
/* We don't care about shared resources */
|
||||
if (ResDesc->ShareDisposition == CmResourceShareShared &&
|
||||
ResDesc2->ShareDisposition == CmResourceShareShared)
|
||||
continue;
|
||||
/* We don't care about shared resources */
|
||||
if (ResDesc->ShareDisposition == CmResourceShareShared &&
|
||||
ResDesc2->ShareDisposition == CmResourceShareShared)
|
||||
continue;
|
||||
|
||||
/* Make sure we're comparing the same types */
|
||||
if (ResDesc->Type != ResDesc2->Type)
|
||||
continue;
|
||||
/* Make sure we're comparing the same types */
|
||||
if (ResDesc->Type != ResDesc2->Type)
|
||||
continue;
|
||||
|
||||
switch (ResDesc->Type)
|
||||
{
|
||||
case CmResourceTypeMemory:
|
||||
if (((ULONGLONG)ResDesc->u.Memory.Start.QuadPart < (ULONGLONG)ResDesc2->u.Memory.Start.QuadPart &&
|
||||
(ULONGLONG)ResDesc->u.Memory.Start.QuadPart + ResDesc->u.Memory.Length >
|
||||
(ULONGLONG)ResDesc2->u.Memory.Start.QuadPart) || ((ULONGLONG)ResDesc2->u.Memory.Start.QuadPart <
|
||||
(ULONGLONG)ResDesc->u.Memory.Start.QuadPart && (ULONGLONG)ResDesc2->u.Memory.Start.QuadPart +
|
||||
ResDesc2->u.Memory.Length > (ULONGLONG)ResDesc->u.Memory.Start.QuadPart))
|
||||
{
|
||||
if (!Silent)
|
||||
{
|
||||
DPRINT1("Resource conflict: Memory (0x%I64x to 0x%I64x vs. 0x%I64x to 0x%I64x)\n",
|
||||
ResDesc->u.Memory.Start.QuadPart, ResDesc->u.Memory.Start.QuadPart +
|
||||
ResDesc->u.Memory.Length, ResDesc2->u.Memory.Start.QuadPart,
|
||||
ResDesc2->u.Memory.Start.QuadPart + ResDesc2->u.Memory.Length);
|
||||
}
|
||||
switch (ResDesc->Type)
|
||||
{
|
||||
case CmResourceTypeMemory:
|
||||
if (((ULONGLONG)ResDesc->u.Memory.Start.QuadPart < (ULONGLONG)ResDesc2->u.Memory.Start.QuadPart &&
|
||||
(ULONGLONG)ResDesc->u.Memory.Start.QuadPart + ResDesc->u.Memory.Length >
|
||||
(ULONGLONG)ResDesc2->u.Memory.Start.QuadPart) || ((ULONGLONG)ResDesc2->u.Memory.Start.QuadPart <
|
||||
(ULONGLONG)ResDesc->u.Memory.Start.QuadPart && (ULONGLONG)ResDesc2->u.Memory.Start.QuadPart +
|
||||
ResDesc2->u.Memory.Length > (ULONGLONG)ResDesc->u.Memory.Start.QuadPart))
|
||||
{
|
||||
if (!Silent)
|
||||
{
|
||||
DPRINT1("Resource conflict: Memory (0x%I64x to 0x%I64x vs. 0x%I64x to 0x%I64x)\n",
|
||||
ResDesc->u.Memory.Start.QuadPart, ResDesc->u.Memory.Start.QuadPart +
|
||||
ResDesc->u.Memory.Length, ResDesc2->u.Memory.Start.QuadPart,
|
||||
ResDesc2->u.Memory.Start.QuadPart + ResDesc2->u.Memory.Length);
|
||||
}
|
||||
|
||||
Result = TRUE;
|
||||
Result = TRUE;
|
||||
|
||||
goto ByeBye;
|
||||
}
|
||||
break;
|
||||
goto ByeBye;
|
||||
}
|
||||
break;
|
||||
|
||||
case CmResourceTypePort:
|
||||
if (((ULONGLONG)ResDesc->u.Port.Start.QuadPart < (ULONGLONG)ResDesc2->u.Port.Start.QuadPart &&
|
||||
(ULONGLONG)ResDesc->u.Port.Start.QuadPart + ResDesc->u.Port.Length >
|
||||
(ULONGLONG)ResDesc2->u.Port.Start.QuadPart) || ((ULONGLONG)ResDesc2->u.Port.Start.QuadPart <
|
||||
(ULONGLONG)ResDesc->u.Port.Start.QuadPart && (ULONGLONG)ResDesc2->u.Port.Start.QuadPart +
|
||||
ResDesc2->u.Port.Length > (ULONGLONG)ResDesc->u.Port.Start.QuadPart))
|
||||
{
|
||||
if (!Silent)
|
||||
{
|
||||
DPRINT1("Resource conflict: Port (0x%I64x to 0x%I64x vs. 0x%I64x to 0x%I64x)\n",
|
||||
ResDesc->u.Port.Start.QuadPart, ResDesc->u.Port.Start.QuadPart +
|
||||
ResDesc->u.Port.Length, ResDesc2->u.Port.Start.QuadPart,
|
||||
ResDesc2->u.Port.Start.QuadPart + ResDesc2->u.Port.Length);
|
||||
}
|
||||
case CmResourceTypePort:
|
||||
if (((ULONGLONG)ResDesc->u.Port.Start.QuadPart < (ULONGLONG)ResDesc2->u.Port.Start.QuadPart &&
|
||||
(ULONGLONG)ResDesc->u.Port.Start.QuadPart + ResDesc->u.Port.Length >
|
||||
(ULONGLONG)ResDesc2->u.Port.Start.QuadPart) || ((ULONGLONG)ResDesc2->u.Port.Start.QuadPart <
|
||||
(ULONGLONG)ResDesc->u.Port.Start.QuadPart && (ULONGLONG)ResDesc2->u.Port.Start.QuadPart +
|
||||
ResDesc2->u.Port.Length > (ULONGLONG)ResDesc->u.Port.Start.QuadPart))
|
||||
{
|
||||
if (!Silent)
|
||||
{
|
||||
DPRINT1("Resource conflict: Port (0x%I64x to 0x%I64x vs. 0x%I64x to 0x%I64x)\n",
|
||||
ResDesc->u.Port.Start.QuadPart, ResDesc->u.Port.Start.QuadPart +
|
||||
ResDesc->u.Port.Length, ResDesc2->u.Port.Start.QuadPart,
|
||||
ResDesc2->u.Port.Start.QuadPart + ResDesc2->u.Port.Length);
|
||||
}
|
||||
|
||||
Result = TRUE;
|
||||
Result = TRUE;
|
||||
|
||||
goto ByeBye;
|
||||
}
|
||||
break;
|
||||
goto ByeBye;
|
||||
}
|
||||
break;
|
||||
|
||||
case CmResourceTypeInterrupt:
|
||||
if (ResDesc->u.Interrupt.Vector == ResDesc2->u.Interrupt.Vector)
|
||||
{
|
||||
if (!Silent)
|
||||
{
|
||||
DPRINT1("Resource conflict: IRQ (0x%x 0x%x vs. 0x%x 0x%x)\n",
|
||||
ResDesc->u.Interrupt.Vector, ResDesc->u.Interrupt.Level,
|
||||
ResDesc2->u.Interrupt.Vector, ResDesc2->u.Interrupt.Level);
|
||||
}
|
||||
case CmResourceTypeInterrupt:
|
||||
if (ResDesc->u.Interrupt.Vector == ResDesc2->u.Interrupt.Vector)
|
||||
{
|
||||
if (!Silent)
|
||||
{
|
||||
DPRINT1("Resource conflict: IRQ (0x%x 0x%x vs. 0x%x 0x%x)\n",
|
||||
ResDesc->u.Interrupt.Vector, ResDesc->u.Interrupt.Level,
|
||||
ResDesc2->u.Interrupt.Vector, ResDesc2->u.Interrupt.Level);
|
||||
}
|
||||
|
||||
Result = TRUE;
|
||||
Result = TRUE;
|
||||
|
||||
goto ByeBye;
|
||||
}
|
||||
break;
|
||||
goto ByeBye;
|
||||
}
|
||||
break;
|
||||
|
||||
case CmResourceTypeBusNumber:
|
||||
if ((ResDesc->u.BusNumber.Start < ResDesc2->u.BusNumber.Start &&
|
||||
ResDesc->u.BusNumber.Start + ResDesc->u.BusNumber.Length >
|
||||
ResDesc2->u.BusNumber.Start) || (ResDesc2->u.BusNumber.Start <
|
||||
ResDesc->u.BusNumber.Start && ResDesc2->u.BusNumber.Start +
|
||||
ResDesc2->u.BusNumber.Length > ResDesc->u.BusNumber.Start))
|
||||
{
|
||||
if (!Silent)
|
||||
{
|
||||
DPRINT1("Resource conflict: Bus number (0x%x to 0x%x vs. 0x%x to 0x%x)\n",
|
||||
ResDesc->u.BusNumber.Start, ResDesc->u.BusNumber.Start +
|
||||
ResDesc->u.BusNumber.Length, ResDesc2->u.BusNumber.Start,
|
||||
ResDesc2->u.BusNumber.Start + ResDesc2->u.BusNumber.Length);
|
||||
}
|
||||
case CmResourceTypeBusNumber:
|
||||
if ((ResDesc->u.BusNumber.Start < ResDesc2->u.BusNumber.Start &&
|
||||
ResDesc->u.BusNumber.Start + ResDesc->u.BusNumber.Length >
|
||||
ResDesc2->u.BusNumber.Start) || (ResDesc2->u.BusNumber.Start <
|
||||
ResDesc->u.BusNumber.Start && ResDesc2->u.BusNumber.Start +
|
||||
ResDesc2->u.BusNumber.Length > ResDesc->u.BusNumber.Start))
|
||||
{
|
||||
if (!Silent)
|
||||
{
|
||||
DPRINT1("Resource conflict: Bus number (0x%x to 0x%x vs. 0x%x to 0x%x)\n",
|
||||
ResDesc->u.BusNumber.Start, ResDesc->u.BusNumber.Start +
|
||||
ResDesc->u.BusNumber.Length, ResDesc2->u.BusNumber.Start,
|
||||
ResDesc2->u.BusNumber.Start + ResDesc2->u.BusNumber.Length);
|
||||
}
|
||||
|
||||
Result = TRUE;
|
||||
Result = TRUE;
|
||||
|
||||
goto ByeBye;
|
||||
}
|
||||
break;
|
||||
goto ByeBye;
|
||||
}
|
||||
break;
|
||||
|
||||
case CmResourceTypeDma:
|
||||
if (ResDesc->u.Dma.Channel == ResDesc2->u.Dma.Channel)
|
||||
{
|
||||
if (!Silent)
|
||||
{
|
||||
DPRINT1("Resource conflict: Dma (0x%x 0x%x vs. 0x%x 0x%x)\n",
|
||||
ResDesc->u.Dma.Channel, ResDesc->u.Dma.Port,
|
||||
ResDesc2->u.Dma.Channel, ResDesc2->u.Dma.Port);
|
||||
}
|
||||
case CmResourceTypeDma:
|
||||
if (ResDesc->u.Dma.Channel == ResDesc2->u.Dma.Channel)
|
||||
{
|
||||
if (!Silent)
|
||||
{
|
||||
DPRINT1("Resource conflict: Dma (0x%x 0x%x vs. 0x%x 0x%x)\n",
|
||||
ResDesc->u.Dma.Channel, ResDesc->u.Dma.Port,
|
||||
ResDesc2->u.Dma.Channel, ResDesc2->u.Dma.Port);
|
||||
}
|
||||
|
||||
Result = TRUE;
|
||||
Result = TRUE;
|
||||
|
||||
goto ByeBye;
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
goto ByeBye;
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
ByeBye:
|
||||
|
||||
if (Result && ConflictingDescriptor)
|
||||
{
|
||||
RtlCopyMemory(ConflictingDescriptor,
|
||||
ResDesc,
|
||||
sizeof(CM_PARTIAL_RESOURCE_DESCRIPTOR));
|
||||
}
|
||||
if (Result && ConflictingDescriptor)
|
||||
{
|
||||
RtlCopyMemory(ConflictingDescriptor,
|
||||
ResDesc,
|
||||
sizeof(CM_PARTIAL_RESOURCE_DESCRIPTOR));
|
||||
}
|
||||
|
||||
return Result;
|
||||
return Result;
|
||||
}
|
||||
|
||||
static
|
||||
NTSTATUS
|
||||
IopUpdateControlKeyWithResources(IN PDEVICE_NODE DeviceNode)
|
||||
IopUpdateControlKeyWithResources(
|
||||
IN PDEVICE_NODE DeviceNode)
|
||||
{
|
||||
UNICODE_STRING EnumRoot = RTL_CONSTANT_STRING(ENUM_ROOT);
|
||||
UNICODE_STRING Control = RTL_CONSTANT_STRING(L"Control");
|
||||
UNICODE_STRING ValueName = RTL_CONSTANT_STRING(L"AllocConfig");
|
||||
HANDLE EnumKey, InstanceKey, ControlKey;
|
||||
NTSTATUS Status;
|
||||
OBJECT_ATTRIBUTES ObjectAttributes;
|
||||
UNICODE_STRING EnumRoot = RTL_CONSTANT_STRING(ENUM_ROOT);
|
||||
UNICODE_STRING Control = RTL_CONSTANT_STRING(L"Control");
|
||||
UNICODE_STRING ValueName = RTL_CONSTANT_STRING(L"AllocConfig");
|
||||
HANDLE EnumKey, InstanceKey, ControlKey;
|
||||
NTSTATUS Status;
|
||||
OBJECT_ATTRIBUTES ObjectAttributes;
|
||||
|
||||
/* Open the Enum key */
|
||||
Status = IopOpenRegistryKeyEx(&EnumKey, NULL, &EnumRoot, KEY_ENUMERATE_SUB_KEYS);
|
||||
if (!NT_SUCCESS(Status))
|
||||
return Status;
|
||||
/* Open the Enum key */
|
||||
Status = IopOpenRegistryKeyEx(&EnumKey, NULL, &EnumRoot, KEY_ENUMERATE_SUB_KEYS);
|
||||
if (!NT_SUCCESS(Status))
|
||||
return Status;
|
||||
|
||||
/* Open the instance key (eg. Root\PNP0A03) */
|
||||
Status = IopOpenRegistryKeyEx(&InstanceKey, EnumKey, &DeviceNode->InstancePath, KEY_ENUMERATE_SUB_KEYS);
|
||||
ZwClose(EnumKey);
|
||||
/* Open the instance key (eg. Root\PNP0A03) */
|
||||
Status = IopOpenRegistryKeyEx(&InstanceKey, EnumKey, &DeviceNode->InstancePath, KEY_ENUMERATE_SUB_KEYS);
|
||||
ZwClose(EnumKey);
|
||||
|
||||
if (!NT_SUCCESS(Status))
|
||||
return Status;
|
||||
if (!NT_SUCCESS(Status))
|
||||
return Status;
|
||||
|
||||
/* Create/Open the Control key */
|
||||
InitializeObjectAttributes(&ObjectAttributes,
|
||||
&Control,
|
||||
OBJ_CASE_INSENSITIVE | OBJ_KERNEL_HANDLE,
|
||||
InstanceKey,
|
||||
NULL);
|
||||
Status = ZwCreateKey(&ControlKey,
|
||||
KEY_SET_VALUE,
|
||||
&ObjectAttributes,
|
||||
0,
|
||||
NULL,
|
||||
REG_OPTION_VOLATILE,
|
||||
NULL);
|
||||
ZwClose(InstanceKey);
|
||||
/* Create/Open the Control key */
|
||||
InitializeObjectAttributes(&ObjectAttributes,
|
||||
&Control,
|
||||
OBJ_CASE_INSENSITIVE | OBJ_KERNEL_HANDLE,
|
||||
InstanceKey,
|
||||
NULL);
|
||||
Status = ZwCreateKey(&ControlKey,
|
||||
KEY_SET_VALUE,
|
||||
&ObjectAttributes,
|
||||
0,
|
||||
NULL,
|
||||
REG_OPTION_VOLATILE,
|
||||
NULL);
|
||||
ZwClose(InstanceKey);
|
||||
|
||||
if (!NT_SUCCESS(Status))
|
||||
return Status;
|
||||
if (!NT_SUCCESS(Status))
|
||||
return Status;
|
||||
|
||||
/* Write the resource list */
|
||||
Status = ZwSetValueKey(ControlKey,
|
||||
&ValueName,
|
||||
0,
|
||||
REG_RESOURCE_LIST,
|
||||
DeviceNode->ResourceList,
|
||||
PnpDetermineResourceListSize(DeviceNode->ResourceList));
|
||||
ZwClose(ControlKey);
|
||||
/* Write the resource list */
|
||||
Status = ZwSetValueKey(ControlKey,
|
||||
&ValueName,
|
||||
0,
|
||||
REG_RESOURCE_LIST,
|
||||
DeviceNode->ResourceList,
|
||||
PnpDetermineResourceListSize(DeviceNode->ResourceList));
|
||||
ZwClose(ControlKey);
|
||||
|
||||
if (!NT_SUCCESS(Status))
|
||||
return Status;
|
||||
if (!NT_SUCCESS(Status))
|
||||
return Status;
|
||||
|
||||
return STATUS_SUCCESS;
|
||||
return STATUS_SUCCESS;
|
||||
}
|
||||
|
||||
static
|
||||
NTSTATUS
|
||||
IopFilterResourceRequirements(IN PDEVICE_NODE DeviceNode)
|
||||
IopFilterResourceRequirements(
|
||||
IN PDEVICE_NODE DeviceNode)
|
||||
{
|
||||
IO_STACK_LOCATION Stack;
|
||||
IO_STATUS_BLOCK IoStatusBlock;
|
||||
NTSTATUS Status;
|
||||
IO_STACK_LOCATION Stack;
|
||||
IO_STATUS_BLOCK IoStatusBlock;
|
||||
NTSTATUS Status;
|
||||
|
||||
DPRINT("Sending IRP_MN_FILTER_RESOURCE_REQUIREMENTS to device stack\n");
|
||||
DPRINT("Sending IRP_MN_FILTER_RESOURCE_REQUIREMENTS to device stack\n");
|
||||
|
||||
Stack.Parameters.FilterResourceRequirements.IoResourceRequirementList = DeviceNode->ResourceRequirements;
|
||||
Status = IopInitiatePnpIrp(
|
||||
DeviceNode->PhysicalDeviceObject,
|
||||
&IoStatusBlock,
|
||||
IRP_MN_FILTER_RESOURCE_REQUIREMENTS,
|
||||
&Stack);
|
||||
if (!NT_SUCCESS(Status) && Status != STATUS_NOT_SUPPORTED)
|
||||
{
|
||||
DPRINT1("IopInitiatePnpIrp(IRP_MN_FILTER_RESOURCE_REQUIREMENTS) failed\n");
|
||||
return Status;
|
||||
}
|
||||
else if (NT_SUCCESS(Status) && IoStatusBlock.Information)
|
||||
{
|
||||
DeviceNode->ResourceRequirements = (PIO_RESOURCE_REQUIREMENTS_LIST)IoStatusBlock.Information;
|
||||
}
|
||||
Stack.Parameters.FilterResourceRequirements.IoResourceRequirementList = DeviceNode->ResourceRequirements;
|
||||
Status = IopInitiatePnpIrp(DeviceNode->PhysicalDeviceObject,
|
||||
&IoStatusBlock,
|
||||
IRP_MN_FILTER_RESOURCE_REQUIREMENTS,
|
||||
&Stack);
|
||||
if (!NT_SUCCESS(Status) && Status != STATUS_NOT_SUPPORTED)
|
||||
{
|
||||
DPRINT1("IopInitiatePnpIrp(IRP_MN_FILTER_RESOURCE_REQUIREMENTS) failed\n");
|
||||
return Status;
|
||||
}
|
||||
else if (NT_SUCCESS(Status) && IoStatusBlock.Information)
|
||||
{
|
||||
DeviceNode->ResourceRequirements = (PIO_RESOURCE_REQUIREMENTS_LIST)IoStatusBlock.Information;
|
||||
}
|
||||
|
||||
return STATUS_SUCCESS;
|
||||
return STATUS_SUCCESS;
|
||||
}
|
||||
|
||||
|
||||
NTSTATUS
|
||||
IopUpdateResourceMap(IN PDEVICE_NODE DeviceNode, PWCHAR Level1Key, PWCHAR Level2Key)
|
||||
IopUpdateResourceMap(
|
||||
IN PDEVICE_NODE DeviceNode,
|
||||
PWCHAR Level1Key,
|
||||
PWCHAR Level2Key)
|
||||
{
|
||||
NTSTATUS Status;
|
||||
ULONG Disposition;
|
||||
HANDLE PnpMgrLevel1, PnpMgrLevel2, ResourceMapKey;
|
||||
UNICODE_STRING KeyName;
|
||||
OBJECT_ATTRIBUTES ObjectAttributes;
|
||||
NTSTATUS Status;
|
||||
ULONG Disposition;
|
||||
HANDLE PnpMgrLevel1, PnpMgrLevel2, ResourceMapKey;
|
||||
UNICODE_STRING KeyName;
|
||||
OBJECT_ATTRIBUTES ObjectAttributes;
|
||||
|
||||
RtlInitUnicodeString(&KeyName,
|
||||
L"\\Registry\\Machine\\HARDWARE\\RESOURCEMAP");
|
||||
InitializeObjectAttributes(&ObjectAttributes,
|
||||
&KeyName,
|
||||
OBJ_CASE_INSENSITIVE | OBJ_OPENIF | OBJ_KERNEL_HANDLE,
|
||||
NULL,
|
||||
NULL);
|
||||
Status = ZwCreateKey(&ResourceMapKey,
|
||||
KEY_ALL_ACCESS,
|
||||
&ObjectAttributes,
|
||||
0,
|
||||
NULL,
|
||||
REG_OPTION_VOLATILE,
|
||||
&Disposition);
|
||||
if (!NT_SUCCESS(Status))
|
||||
return Status;
|
||||
RtlInitUnicodeString(&KeyName,
|
||||
L"\\Registry\\Machine\\HARDWARE\\RESOURCEMAP");
|
||||
InitializeObjectAttributes(&ObjectAttributes,
|
||||
&KeyName,
|
||||
OBJ_CASE_INSENSITIVE | OBJ_OPENIF | OBJ_KERNEL_HANDLE,
|
||||
NULL,
|
||||
NULL);
|
||||
Status = ZwCreateKey(&ResourceMapKey,
|
||||
KEY_ALL_ACCESS,
|
||||
&ObjectAttributes,
|
||||
0,
|
||||
NULL,
|
||||
REG_OPTION_VOLATILE,
|
||||
&Disposition);
|
||||
if (!NT_SUCCESS(Status))
|
||||
return Status;
|
||||
|
||||
RtlInitUnicodeString(&KeyName, Level1Key);
|
||||
InitializeObjectAttributes(&ObjectAttributes,
|
||||
&KeyName,
|
||||
OBJ_CASE_INSENSITIVE | OBJ_OPENIF | OBJ_KERNEL_HANDLE,
|
||||
ResourceMapKey,
|
||||
NULL);
|
||||
Status = ZwCreateKey(&PnpMgrLevel1,
|
||||
KEY_ALL_ACCESS,
|
||||
&ObjectAttributes,
|
||||
0,
|
||||
NULL,
|
||||
REG_OPTION_VOLATILE,
|
||||
&Disposition);
|
||||
ZwClose(ResourceMapKey);
|
||||
if (!NT_SUCCESS(Status))
|
||||
return Status;
|
||||
RtlInitUnicodeString(&KeyName, Level1Key);
|
||||
InitializeObjectAttributes(&ObjectAttributes,
|
||||
&KeyName,
|
||||
OBJ_CASE_INSENSITIVE | OBJ_OPENIF | OBJ_KERNEL_HANDLE,
|
||||
ResourceMapKey,
|
||||
NULL);
|
||||
Status = ZwCreateKey(&PnpMgrLevel1,
|
||||
KEY_ALL_ACCESS,
|
||||
&ObjectAttributes,
|
||||
0,
|
||||
NULL,
|
||||
REG_OPTION_VOLATILE,
|
||||
&Disposition);
|
||||
ZwClose(ResourceMapKey);
|
||||
if (!NT_SUCCESS(Status))
|
||||
return Status;
|
||||
|
||||
RtlInitUnicodeString(&KeyName, Level2Key);
|
||||
InitializeObjectAttributes(&ObjectAttributes,
|
||||
&KeyName,
|
||||
OBJ_CASE_INSENSITIVE | OBJ_OPENIF | OBJ_KERNEL_HANDLE,
|
||||
PnpMgrLevel1,
|
||||
NULL);
|
||||
Status = ZwCreateKey(&PnpMgrLevel2,
|
||||
KEY_ALL_ACCESS,
|
||||
&ObjectAttributes,
|
||||
0,
|
||||
NULL,
|
||||
REG_OPTION_VOLATILE,
|
||||
&Disposition);
|
||||
ZwClose(PnpMgrLevel1);
|
||||
if (!NT_SUCCESS(Status))
|
||||
return Status;
|
||||
RtlInitUnicodeString(&KeyName, Level2Key);
|
||||
InitializeObjectAttributes(&ObjectAttributes,
|
||||
&KeyName,
|
||||
OBJ_CASE_INSENSITIVE | OBJ_OPENIF | OBJ_KERNEL_HANDLE,
|
||||
PnpMgrLevel1,
|
||||
NULL);
|
||||
Status = ZwCreateKey(&PnpMgrLevel2,
|
||||
KEY_ALL_ACCESS,
|
||||
&ObjectAttributes,
|
||||
0,
|
||||
NULL,
|
||||
REG_OPTION_VOLATILE,
|
||||
&Disposition);
|
||||
ZwClose(PnpMgrLevel1);
|
||||
if (!NT_SUCCESS(Status))
|
||||
return Status;
|
||||
|
||||
if (DeviceNode->ResourceList)
|
||||
{
|
||||
UNICODE_STRING NameU;
|
||||
UNICODE_STRING RawSuffix, TranslatedSuffix;
|
||||
ULONG OldLength = 0;
|
||||
if (DeviceNode->ResourceList)
|
||||
{
|
||||
UNICODE_STRING NameU;
|
||||
UNICODE_STRING RawSuffix, TranslatedSuffix;
|
||||
ULONG OldLength = 0;
|
||||
|
||||
ASSERT(DeviceNode->ResourceListTranslated);
|
||||
ASSERT(DeviceNode->ResourceListTranslated);
|
||||
|
||||
RtlInitUnicodeString(&TranslatedSuffix, L".Translated");
|
||||
RtlInitUnicodeString(&RawSuffix, L".Raw");
|
||||
RtlInitUnicodeString(&TranslatedSuffix, L".Translated");
|
||||
RtlInitUnicodeString(&RawSuffix, L".Raw");
|
||||
|
||||
Status = IoGetDeviceProperty(DeviceNode->PhysicalDeviceObject,
|
||||
DevicePropertyPhysicalDeviceObjectName,
|
||||
0,
|
||||
NULL,
|
||||
&OldLength);
|
||||
if (Status == STATUS_BUFFER_OVERFLOW || Status == STATUS_BUFFER_TOO_SMALL)
|
||||
{
|
||||
ASSERT(OldLength);
|
||||
Status = IoGetDeviceProperty(DeviceNode->PhysicalDeviceObject,
|
||||
DevicePropertyPhysicalDeviceObjectName,
|
||||
0,
|
||||
NULL,
|
||||
&OldLength);
|
||||
if (Status == STATUS_BUFFER_OVERFLOW || Status == STATUS_BUFFER_TOO_SMALL)
|
||||
{
|
||||
ASSERT(OldLength);
|
||||
|
||||
NameU.Buffer = ExAllocatePool(PagedPool, OldLength + TranslatedSuffix.Length);
|
||||
if (!NameU.Buffer)
|
||||
{
|
||||
ZwClose(PnpMgrLevel2);
|
||||
return STATUS_INSUFFICIENT_RESOURCES;
|
||||
}
|
||||
NameU.Buffer = ExAllocatePool(PagedPool, OldLength + TranslatedSuffix.Length);
|
||||
if (!NameU.Buffer)
|
||||
{
|
||||
ZwClose(PnpMgrLevel2);
|
||||
return STATUS_INSUFFICIENT_RESOURCES;
|
||||
}
|
||||
|
||||
NameU.Length = 0;
|
||||
NameU.MaximumLength = (USHORT)OldLength + TranslatedSuffix.Length;
|
||||
NameU.Length = 0;
|
||||
NameU.MaximumLength = (USHORT)OldLength + TranslatedSuffix.Length;
|
||||
|
||||
Status = IoGetDeviceProperty(DeviceNode->PhysicalDeviceObject,
|
||||
DevicePropertyPhysicalDeviceObjectName,
|
||||
NameU.MaximumLength,
|
||||
NameU.Buffer,
|
||||
&OldLength);
|
||||
if (!NT_SUCCESS(Status))
|
||||
{
|
||||
ZwClose(PnpMgrLevel2);
|
||||
ExFreePool(NameU.Buffer);
|
||||
return Status;
|
||||
}
|
||||
}
|
||||
else if (!NT_SUCCESS(Status))
|
||||
{
|
||||
/* Some failure */
|
||||
ZwClose(PnpMgrLevel2);
|
||||
return Status;
|
||||
}
|
||||
else
|
||||
{
|
||||
/* This should never happen */
|
||||
ASSERT(FALSE);
|
||||
}
|
||||
Status = IoGetDeviceProperty(DeviceNode->PhysicalDeviceObject,
|
||||
DevicePropertyPhysicalDeviceObjectName,
|
||||
NameU.MaximumLength,
|
||||
NameU.Buffer,
|
||||
&OldLength);
|
||||
if (!NT_SUCCESS(Status))
|
||||
{
|
||||
ZwClose(PnpMgrLevel2);
|
||||
ExFreePool(NameU.Buffer);
|
||||
return Status;
|
||||
}
|
||||
}
|
||||
else if (!NT_SUCCESS(Status))
|
||||
{
|
||||
/* Some failure */
|
||||
ZwClose(PnpMgrLevel2);
|
||||
return Status;
|
||||
}
|
||||
else
|
||||
{
|
||||
/* This should never happen */
|
||||
ASSERT(FALSE);
|
||||
}
|
||||
|
||||
NameU.Length = (USHORT)OldLength;
|
||||
NameU.Length = (USHORT)OldLength;
|
||||
|
||||
RtlAppendUnicodeStringToString(&NameU, &RawSuffix);
|
||||
RtlAppendUnicodeStringToString(&NameU, &RawSuffix);
|
||||
|
||||
Status = ZwSetValueKey(PnpMgrLevel2,
|
||||
&NameU,
|
||||
0,
|
||||
REG_RESOURCE_LIST,
|
||||
DeviceNode->ResourceList,
|
||||
PnpDetermineResourceListSize(DeviceNode->ResourceList));
|
||||
if (!NT_SUCCESS(Status))
|
||||
{
|
||||
ZwClose(PnpMgrLevel2);
|
||||
ExFreePool(NameU.Buffer);
|
||||
return Status;
|
||||
}
|
||||
Status = ZwSetValueKey(PnpMgrLevel2,
|
||||
&NameU,
|
||||
0,
|
||||
REG_RESOURCE_LIST,
|
||||
DeviceNode->ResourceList,
|
||||
PnpDetermineResourceListSize(DeviceNode->ResourceList));
|
||||
if (!NT_SUCCESS(Status))
|
||||
{
|
||||
ZwClose(PnpMgrLevel2);
|
||||
ExFreePool(NameU.Buffer);
|
||||
return Status;
|
||||
}
|
||||
|
||||
/* "Remove" the suffix by setting the length back to what it used to be */
|
||||
NameU.Length = (USHORT)OldLength;
|
||||
/* "Remove" the suffix by setting the length back to what it used to be */
|
||||
NameU.Length = (USHORT)OldLength;
|
||||
|
||||
RtlAppendUnicodeStringToString(&NameU, &TranslatedSuffix);
|
||||
RtlAppendUnicodeStringToString(&NameU, &TranslatedSuffix);
|
||||
|
||||
Status = ZwSetValueKey(PnpMgrLevel2,
|
||||
&NameU,
|
||||
0,
|
||||
REG_RESOURCE_LIST,
|
||||
DeviceNode->ResourceListTranslated,
|
||||
PnpDetermineResourceListSize(DeviceNode->ResourceListTranslated));
|
||||
ZwClose(PnpMgrLevel2);
|
||||
ExFreePool(NameU.Buffer);
|
||||
Status = ZwSetValueKey(PnpMgrLevel2,
|
||||
&NameU,
|
||||
0,
|
||||
REG_RESOURCE_LIST,
|
||||
DeviceNode->ResourceListTranslated,
|
||||
PnpDetermineResourceListSize(DeviceNode->ResourceListTranslated));
|
||||
ZwClose(PnpMgrLevel2);
|
||||
ExFreePool(NameU.Buffer);
|
||||
|
||||
if (!NT_SUCCESS(Status))
|
||||
return Status;
|
||||
}
|
||||
else
|
||||
{
|
||||
ZwClose(PnpMgrLevel2);
|
||||
}
|
||||
if (!NT_SUCCESS(Status))
|
||||
return Status;
|
||||
}
|
||||
else
|
||||
{
|
||||
ZwClose(PnpMgrLevel2);
|
||||
}
|
||||
|
||||
return STATUS_SUCCESS;
|
||||
return STATUS_SUCCESS;
|
||||
}
|
||||
|
||||
NTSTATUS
|
||||
IopUpdateResourceMapForPnPDevice(IN PDEVICE_NODE DeviceNode)
|
||||
IopUpdateResourceMapForPnPDevice(
|
||||
IN PDEVICE_NODE DeviceNode)
|
||||
{
|
||||
return IopUpdateResourceMap(DeviceNode, L"PnP Manager", L"PnpManager");
|
||||
return IopUpdateResourceMap(DeviceNode, L"PnP Manager", L"PnpManager");
|
||||
}
|
||||
|
||||
static
|
||||
|
|
Loading…
Reference in a new issue