driver - hvordan man kontrollerer status for Windows-enheder, når pc genstartes?

Indlæg af Hanne Mølgaard Plasc

Problem



Jeg vil gerne tjekke alle enheder (som wifi eller bluetooth) status, ved at vide, at de fungerer fint eller ej, eller de taber, når jeg genstarter stresstesten, hvordan kan jeg få enhedens status (som enhedens enhed i enhedsstyring)? har windows API for at få det?

Bedste reference


for at få status for enheder, du skal ringe CM\_Get\_DevNode\_Status [9]


for at få DEVINST dnDevInst kan du opregne alle enheder med CM\_Get\_Device\_ID\_ListW + CM\_Locate\_DevNode eller alternativ brug CM\_Locate\_DevNode + CM\_Get\_Child + CM\_Get\_Sibling]] [10] [11] [12] [13] [14]


for eksempel:


void enumDN(DEVINST dnDevInst)
{
    union {
        PVOID buf;
        PBYTE pb;
        PWSTR sz;
    };

    ULONG cb = 0, rcb = 256;

    static volatile UCHAR guz;

    PVOID stack = alloca(guz);

    WCHAR Name[MAX\_DEVICE\_ID\_LEN];

    CONFIGRET err;

    if (CM\_Get\_Device\_ID(dnDevInst, Name, RTL\_NUMBER\_OF(Name), 0) == CR\_SUCCESS)
    {
        DEVPROPTYPE PropertyType;
        ULONG Status, ulProblemNumber;

        if (CM\_Get\_DevInst\_Status(&Status, &ulProblemNumber, dnDevInst, 0) == CR\_SUCCESS)
        {
            PWSTR FriendlyName = NULL;
            do 
            {
                if (cb < rcb)
                {
                    rcb = cb = RtlPointerToOffset(buf = alloca(rcb - cb), stack);
                }

                if ((err = CM\_Get\_DevNode\_PropertyW(dnDevInst, &DEVPKEY\_Device\_FriendlyName, 
                    &PropertyType, pb, &rcb, 0)) == CR\_SUCCESS)
                {
                    if (PropertyType == DEVPROP\_TYPE\_STRING)
                    {
                        FriendlyName = sz;
                    }
                }

            } while (err == CR\_BUFFER\_SMALL);

            DbgPrint("\%08x \%S \%S
", Status, Name, FriendlyName);
        }
    }

    if ((err = CM\_Get\_Child(&dnDevInst, dnDevInst, 0)) == CR\_SUCCESS)
    {
        do 
        {
            enumDN(dnDevInst);

        } while ((err = CM\_Get\_Sibling(&dnDevInst, dnDevInst, 0)) == CR\_SUCCESS);
    }
}

void enumDN()
{
    DEVINST dnDevInst;
    if (CM\_Locate\_DevInstW(&dnDevInst, NULL, 0) == CR\_SUCCESS)
    {
        enumDN(dnDevInst);
    }
}