Win32 API для получения UUID машины - PullRequest
0 голосов
/ 16 марта 2020

Я хочу получить UUID компьютера.

Я хочу получить эквивалент этого, но вместо этого использую Win32 API:

wmi c csproduct get " UUID "

Мне не нужна зависимость от WMI.

1 Ответ

1 голос
/ 17 марта 2020

Вот пример кода: (Используйте GetSystemFirmwareTable )

GetSystemFirmwareTable: Извлекает указанную таблицу встроенного ПО из провайдера таблицы встроенного ПО.

#include <Windows.h>
#include <string>
#include <tchar.h>


typedef struct _dmi_header
{
    BYTE type;
    BYTE length;
    WORD handle;
}dmi_header;



typedef struct _RawSMBIOSData
{
    BYTE    Used20CallingMethod;
    BYTE    SMBIOSMajorVersion;
    BYTE    SMBIOSMinorVersion;
    BYTE    DmiRevision;
    DWORD   Length;
    BYTE    SMBIOSTableData[];
}RawSMBIOSData;


static void dmi_system_uuid(const BYTE *p, short ver)
{
    int only0xFF = 1, only0x00 = 1;
    int i;

    for (i = 0; i < 16 && (only0x00 || only0xFF); i++)
    {
        if (p[i] != 0x00) only0x00 = 0;
        if (p[i] != 0xFF) only0xFF = 0;
    }



    if (only0xFF)
    {
        printf("Not Present");
        return;
    }

    if (only0x00)
    {
        printf("Not Settable");
        return;
    }


    if (ver >= 0x0206)
        printf("%02X%02X%02X%02X-%02X%02X-%02X%02X-%02X%02X-%02X%02X%02X%02X%02X%02X\n",
            p[3], p[2], p[1], p[0], p[5], p[4], p[7], p[6],
            p[8], p[9], p[10], p[11], p[12], p[13], p[14], p[15]);
    else
        printf("-%02X%02X%02X%02X-%02X%02X-%02X%02X-%02X%02X-%02X%02X%02X%02X%02X%02X\n",
            p[0], p[1], p[2], p[3], p[4], p[5], p[6], p[7],
            p[8], p[9], p[10], p[11], p[12], p[13], p[14], p[15]);
}


const char *dmi_string(const dmi_header *dm, BYTE s)
{
    char *bp = (char *)dm;
    size_t i, len;

    if (s == 0)
        return "Not Specified";

    bp += dm->length;

    while (s > 1 && *bp)
    {
        bp += strlen(bp);
        bp++;
        s--;
    }
    if (!*bp)
        return "BAD_INDEX";

    /* ASCII filtering */
    len = strlen(bp);
    for (i = 0; i < len; i++)
        if (bp[i] < 32 || bp[i] == 127)
            bp[i] = '.';
    return bp;
}



int _tmain(int argc, _TCHAR* argv[])
{
    DWORD bufsize = 0;
    BYTE buf[65536] = { 0 };
    int ret = 0;
    RawSMBIOSData *Smbios;
    dmi_header *h = NULL;
    int flag = 1;

    ret = GetSystemFirmwareTable('RSMB', 0, 0, 0);
    if (!ret)
    {
        printf("Function failed!\n");
        return 1;
    }

    printf("get buffer size is %d\n", ret);
    bufsize = ret;

    ret = GetSystemFirmwareTable('RSMB', 0, buf, bufsize);

    if (!ret)
    {
        printf("Function failed!\n");
        return 1;
    }



    Smbios = (RawSMBIOSData *)buf;
    BYTE *p = Smbios->SMBIOSTableData;

    if (Smbios->Length != bufsize - 8)
    {
        printf("Smbios length error\n");
        return 1;
    }

    for (int i = 0; i < Smbios->Length; i++) {
        h = (dmi_header *)p;

        if (h->type == 0 && flag) {
            printf("\nType %02d - [BIOS]\n", h->type);
            printf("\tBIOS Vendor : %s\n", dmi_string(h, p[0x4]));
            printf("\tBIOS Version: %s\n", dmi_string(h, p[0x5]));
            printf("\tRelease Date: %s\n", dmi_string(h, p[0x8]));

            if (p[0x16] != 0xff && p[0x17] != 0xff)
                printf("\tEC version: %d.%d\n", p[0x16], p[0x17]);
            flag = 0;
        }



        else if (h->type == 1) {
            printf("\nType %02d - [System Information]\n", h->type);
            printf("\tManufacturer: %s\n", dmi_string(h, p[0x4]));
            printf("\tProduct Name: %s\n", dmi_string(h, p[0x5]));
            printf("\tVersion: %s\n", dmi_string(h, p[0x6]));
            printf("\tSerial Number: %s\n", dmi_string(h, p[0x7]));
            printf("\tUUID: "); dmi_system_uuid(p + 0x8, Smbios->SMBIOSMajorVersion * 0x100 + Smbios->SMBIOSMinorVersion);
            printf("\tSKU Number: %s\n", dmi_string(h, p[0x19]));
            printf("\tFamily: %s\n", dmi_string(h, p[0x1a]));
        }
        p += h->length;
        while ((*(WORD *)p) != 0) p++;
        p += 2;
    }

    getchar();
    return 0;

}
...