Re[3]: Реестр виндовс и скрытые устройства
От: Timas  
Дата: 03.09.05 07:50
Оценка:
Здравствуйте, Sergeant_BY, Вы писали:

S_B>А откуда уверенность что этот devnode status обязательно должен быть в реестре?


Уверенности нет. Есть большая надежда, что я смогу его там найти. Может кто-то про это что-нибудь знает.

S_B>CM_Get_DevNode_Status_Ex?


Написал следующую программку:

#define _WIN32_WINNT 0x0501
#define WINVER 0x0501

#include <windows.h>
#include <stdio.h>
#include <conio.h>

#include <setupapi.h>
#include <devguid.h>
#include <cfgmgr32.h>


BOOL GetRegistryProperty(HDEVINFO  DeviceInfoSet, 
                         PSP_DEVINFO_DATA  DeviceInfoData, 
                         ULONG Property, 
                         LPTSTR* Buffer, 
                         PULONG Length) 
{ 
    while (!SetupDiGetDeviceRegistryProperty( 
        DeviceInfoSet, 
        DeviceInfoData, 
        Property, 
        NULL, 
        (PBYTE)(*Buffer), 
        *Length, 
        Length 
        )) 
    { 
        int nError = GetLastError();
        if (nError == ERROR_INSUFFICIENT_BUFFER) { 
            if (*(LPTSTR *)Buffer)  
                LocalFree(*(LPTSTR *)Buffer); 
            *Buffer = (LPTSTR)LocalAlloc(LPTR, *Length); 
        }else { 
            return FALSE; 
        }             
    } 
    return TRUE; 
} 


void main(int argc, char* argv[]) {
    BOOL bShowHidden = TRUE;
    DWORD MemberIndex = 0;
    SP_DEVINFO_DATA DeviceInfoData;
    DeviceInfoData.cbSize = sizeof(SP_DEVINFO_DATA);
    ULONG Status;
    ULONG Problem;
    LPSTR pBuffer = 0;
    ULONG Length = 0;

    if (argc > 1)
        bShowHidden = FALSE;
    //PCTSTR MachineName = "\\MyComputer";
    HDEVINFO DeviceInfoSet = SetupDiGetClassDevsEx( 
                                (LPGUID) &GUID_DEVCLASS_NET,
                                NULL,  
                                NULL,  
                                DIGCF_PRESENT,
                                NULL,
                                NULL, // MachineName
                                NULL); 

    if (INVALID_HANDLE_VALUE == DeviceInfoSet) 
    { 
        int nError = GetLastError();
        LPVOID lpMsgBuf;
        if (!FormatMessage( 
            FORMAT_MESSAGE_ALLOCATE_BUFFER | 
            FORMAT_MESSAGE_FROM_SYSTEM | 
            FORMAT_MESSAGE_IGNORE_INSERTS,
            NULL,
            nError,
            MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), // Default language
            (LPTSTR) &lpMsgBuf,
            0,
            NULL ))
        {
           // Handle the error.
           printf("Error: unknown error. Code: %u\n", nError);
           return;
        }

        // Display the string.
        printf("Error: %s\n", (LPCTSTR)lpMsgBuf);

        // Free the buffer.
        LocalFree( lpMsgBuf );
        return; 
    } 
    
    while (SetupDiEnumDeviceInfo(DeviceInfoSet, MemberIndex, &DeviceInfoData))
    {
        MemberIndex++;
        if (CR_SUCCESS != CM_Get_DevNode_Status(&Status, &Problem,  
            DeviceInfoData.DevInst,0)) 
        { 
            continue; 
        }
        if (!bShowHidden && (Status & DN_NO_SHOW_IN_DM)) 
        { 
            continue; 
        } 
        
        if (!GetRegistryProperty(DeviceInfoSet, 
            &DeviceInfoData, 
            SPDRP_FRIENDLYNAME, 
            &pBuffer, 
            &Length)) 
        { 
            if (!GetRegistryProperty(DeviceInfoSet, 
                &DeviceInfoData, 
                SPDRP_DEVICEDESC, 
                &pBuffer, 
                &Length)) 
            { 
                continue;
            }
        }
        printf("%d. %s\n", MemberIndex, pBuffer);
   }
}


При запуске без параметров она выводит на экран список всех сетевых адаптеров на локальной машине. При запуске с любыми параметрами выводит только не скрытые сетевые адаптеры. При переходе от локальной машины к удалённой, возникла проблема.
Функция SetupDiGetClassDevsEx при имени машины отличном от NULL возвращает ошибку. GetLastError даёт какой-то непонятный номер. В чём проблема ума не приложу.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.