windows - Walking PnP træ i kernel mode

Indlæg af Hanne Mølgaard Plasc

Problem



Jeg vil gerne gå Pnp-træ i kernel-tilstand. Det kan gøres i brugermodus med CM\_XXX funktioner, men gør det manuelt, så vi får mere kontrol. Jeg vil også kunne hente afsendelsesrutiner for chauffør af interesse for at vide, hvilke anmodninger den behandler. Jeg vil skitsere pseudokoden for at gå på Pnp-træet:


void TraverseNode(DEVICE\_NODE *Node, MY\_DEVICE\_NODE *MyNode)
{
    List Names;
    HANDLE Handle;
    DEVICE\_NODE *Child;
    MY\_DEVICE\_NODE *MyChild;

    KeAcquireSpinLock(&IopDeviceTreeLock);
    Child = Node->Child;
    while (Child)
    {
        Names.Add(ObQueryNameString(Child->PhysicalDeviceObject);
        Child = Child->Sibling;
    }
    KeReleaseSpinLock(&IopDeviceTreeLock);
    for each Name in Names
    {
         Handle = ZwCreateFile(Name);
         if (Handle)
         {
             Child = Handle->DeviceObject->DeviceObjectExtension->DeviceNode;
             MyChild = CreateMyNode(Child);
             MyNode->Add(MyChild);
             TraverseNode(Child, MyChild);
             ZwClose(Handle);
         }
    }
}

MY\_DEVICE\_NODE* CreateMyNode(DEVICE\_NODE *Node)
{
    MY\_DEVICE\_NODE *MyNode;
    DEVICE\_OBJECT *DeviceObject;

    DeviceObject = Node->PhysicalDeviceObject;

    /*
    here we will create our own tree node
    for each device object in DeviceObject's stack we will store info:
    e.g. device object name, type, characteristics, driver's name, etc.
    */

    return MyNode;
}

// usage:

MyNode = CreateMyNode(IopRootDeviceNode);
TraverseNode(IopRootDeviceNode, MyNode);


De antagelser, jeg lavede:


1) Hvis enhedsknude stadig er forbundet til Pnp-træet, peger PhysicalDeviceObject -medlemmet til gyldigt PDO.


2) Hvis NtCreateFile returnerer succes, er enhedsstabler allerede konstrueret. Det har fuldført IRP\_MN\_START\_DEVICE anmodning, og blev ikke sendt IRP\_MN\_REMOVE\_DEVICE anmodning endnu - så alle enhed objekter er stadig gyldige og vedhæftet.


Bruger-tilstandsapplikationen vil gøre DeviceIoControl opkald til driveren for at hente træ snapshot. Vi vil gøre det ved opstart, og hver gang vi modtager WM\_DEVICECHANGE begivenhed.


Jeg ved ikke, om der er en elegant måde at opnå IopRootDeviceNode og IopDeviceTreeLock, men lad os sige, at vi har dem. Jeg vil gerne spørge, om mit design har potentielle problemer, der kan forårsage BSOD. Giver det mening? Tak skal du have.

Bedste reference