Prihláste sa s kontom Microsoft
Prihláste sa alebo si vytvorte konto.
Dobrý deň,
Vyberte iné konto.
Máte viacero kont
Vyberte konto, s ktorým sa chcete prihlásiť.

ÚVOD

Ak ukladacie zariadenie súvisí s Windows aj v prípade, že iba krátko, systém windows vytvorí informácie databázy registry pre zariadenie. Postupne databázy registry môže obsahovať množstvo položiek pre zariadenia, ktoré sa znovu použijú nikdy. Tento článok popisuje, ako odstrániť tieto informácie z databázy registry systému.

Zodpovedá softvér, ktorý sa vytvorí pripojenie medzi zariadenie a Windows vyčistiť správne informácie pre dané zariadenie. Tento proces je potrebné, pretože systém Windows po odstránení ukladacieho zariadenia alebo dočasný. No softvér, ktorý vytvára spojenie zvyčajne vedieť. Napríklad montáž číslam logických jednotiek (LUN) za účelom zálohovania a potom odpojenie LUN zálohovanie softvéru bude zodpovednosť zálohovacieho softvéru vyčistiť ich LUN zo systému Windows, pretože už nebude rovnaké ukladacie zariadenie použiť znovu Windows.

Ďalšie informácie

Po nové zariadenie je pripojený k počítaču Windows zaznamenáva informácie o zariadenia v databáze registry. Väčšina zariadení, tento postup nepredstavuje problém. Však po LUN vlákna kanál alebo iSCSI predstavuje zariadenie, zariadenie možno nikdy stretnúť znova počítač. Zariadenie môže napríklad identifikujú sériové číslo alebo SCSI stránky 0x80 a 0x83.

V takomto prípade databázy registry môže obsahovať položky pre zariadenia, ktoré nikdy sa znova. Iba tieto položky sa zaberať miesto v databáze registry, tieto položky môže nakoniec spôsobiť problémy s prevádzkou. Keďže indexy pre funkciu Plug and Play používajú štvormiestne desatinné hodnoty, problém môže vyskytnúť pri pripojení zariadenia 10,001.

Na vyriešenie tohto obmedzenia v funkciu Plug and Play, môžete odstráňte z databázy registry informácie o zariadení, keď zariadenie je pevný disk, ktorý už existuje. Môžete to urobiť pomocou nástroja Microsoft DevNodeClean .

Postup pre systém Windows Server 2003, Windows Server 2008, Windows Server 2008 R2 a Visual Studio 2005

Vyčistenie databázy registry pre triedu GUID_DEVCLASS_DISKDRIVE disku GUID pre GUID_DEVCLASS_VOLUME disku Trieda GUID, postupujte nasledovne.

Poznámka:  Odporúčame, že používate DevNodeCleanpomôcka úlohy. Tieto kroky a príklad kódu v kroku 7 sú poskytované len na informačné účely.

  1. Funkciu SetupDiGetClassDevs získať informácie o triede priradený identifikátor GUID.

  2. Funkciu SetupDiEnumDeviceInfo získať informácie o inštancie pre každé zariadenie v aktuálnej triedy.

  3. Funkciu CM_Get_DevNode_Status a skontrolujte, či aktuálne informácie o zariadení predstavuje chýba zariadenie. Overte, či je funkcia stav CR_NO_SUCH_DEVINST alebo CR_NO_SUCH_VALUE.

  4. Prípadne chýbajúce zariadenia, funkciu CM_Get_Device_ID získať Identifikácia inštancie zariadenia a zobrazenie ID pred odstránením informácií.

  5. Chýbajúce zariadenia, použite informácie o triede, ktorú ste získali v kroku 1 a inštanciu informácií, ktoré ste získali v kroku 2. Funkciu SetupDiCallClassInstaller (DIF_REMOVE,...) na odstránenie informácií z databázy registry.

  6. Ak boli spracované všetky zariadenia v aktuálnej triedy, funkciu SetupDiDestroyDeviceInfoList vyčistiť.

Poznámka: V niektorých prípadoch môže byť na čistenie databázy registry, nielen na GUID_DEVCLASS_DISKDRIVE GUID_DEVCLASS_VOLUME disku a triedy GUID, ale aj pre GUID_DEVCLASS_SCSIADAPTER a GUID_DEVCLASS_VOLUMESNAPSHOT disku triedy GUID. Urobiť, musíte zmeniť definíciu DiskClassesToClean v nasledujúcej ukážke kódu.

Tieto konzoly aplikáciou Win32 je napríklad aplikácia, ktorá vyčistí databázy registry. Ak chcete použiť túto aplikáciu, postupujte nasledovne.

Spoločnosť Microsoft poskytuje príklady programovacieho kódu len ako názornú ukážku bez vyjadrených či predpokladaných záruk. Tie okrem iného zahŕňajú predpokladané záruky obchodovateľnosti alebo vhodnosti na konkrétny účel. Tento článok predpokladá, že ovládate predvádzaný programovací jazyk a nástroje, ktoré sa používajú na vytváranie a ladenie procedúr. Pracovníci technickej podpory spoločnosti Microsoft môžu vysvetliť fungovanie konkrétneho postupu. Ale nemôžu tieto príklady poskytovať pridanú funkčnosť alebo konštrukčné procedúry zohľadňujúce vaše konkrétne požiadavky.

  1. Microsoft Visual Studio 2005, kliknite na položku nový v ponuke súbor a kliknite na tlačidlo projekt.

  2. Rozbaľte Visual C++a kliknite na tlačidlo Win32.

  3. Kliknite na tlačidlo Aplikácia konzoly Win32, do poľa názov zadajte Čistenie a kliknite na tlačidlo OK.

  4. Kliknite na tlačidlo Dokončiť v okne Sprievodca aplikáciou Win32 .

  5. Roztok Explorer, rozbaľte Zdrojové súbory, kliknite pravým tlačidlom myši na Cleanup.cppa kliknite na tlačidlo Zobraziť kód.

  6. Vyhľadajte nasledujúci kód:

    int _tmain(int argc, _TCHAR* argv[])
    {
    return 0;
    }
    
  7. Nahradenie kódu, ktorý ste vyhľadali v kroku 6 s nasledujúcim kódom.

    /**************************************************************************************************/     
    /*                                                                                                */     
    /* Copyright (c) 2007 Microsoft Corporation.  All Rights Reserved                                 */     
    /*                                                                                                */     
    /**************************************************************************************************/     
    
    #pragma warning( disable : 4201 ) // nonstandard extension used : nameless strut/union
    
    #include <windows.h>
    #include <stdlib.h>
    #include <stdio.h>
    #include <stddef.h>
    #include <tchar.h>
    #include <setupapi.h>
    #include <cfgmgr32.h>
    #include <initguid.h>
    #include <devguid.h>
    
    #define SIZECHARS(x) (sizeof((x))/sizeof(TCHAR))
    #define arraysize(p) (sizeof(p)/sizeof((p)[0]))
    
    CONST GUID *DiskClassesToClean[2] = {
        &GUID_DEVCLASS_DISKDRIVE,
        &GUID_DEVCLASS_VOLUME
    };
    
    /**************************************************************************************************/
    /*                                                                                                */
    /* The user must be member of Administrator group and must have backup and restore permissions         */
    /* (SE_BACKUP_NAME and SE_RESTORE_NAME). No check for these is performed in this example.              */
    /*                                                                                                */
    /**************************************************************************************************/
    int
    __cdecl
    main(
         IN int    ArgC,
         IN char * pArgV[]
        )
    {
        HDEVINFO DeviceInfoSet;
        SP_DEVINFO_DATA DeviceInfoData;
        ULONG DevicesRemoved = 0,
              i,
              MemberIndex,
              Status, 
              Problem,
              ulClassesToCleanIdx;
        BOOL bDoRemove = TRUE;
        CONFIGRET cr;
        TCHAR DeviceInstanceId[MAX_DEVICE_ID_LEN];
        OSVERSIONINFO osvi;
        const GUID ** ClassesToClean;
    
        //
        // Parse parameters.
        //
        for (i = 1; i < (ULONG)ArgC; i++) {
            //
            // Check for help.
            //
            if ( (lstrcmpi(pArgV[i], TEXT("-?")) == 0) ||
                    (lstrcmpi(pArgV[i], TEXT("/?")) == 0) ){
    
                printf("\nCleanUp will remove phantom storage device nodes from this machine.\n\n");
                printf("Usage:  CleanUp \n");
                printf("\twhere /n displays but does not remove the phantom devnodes.\n");
                printf("\nBackup and Restore privileges are required to run this utility.\n");
                return 0;
            }
    
            //
            // Check for -n, which means just list the devices that we would remove.
            //
            if ( (lstrcmpi(pArgV[i], TEXT("-n")) == 0) ||
                 (lstrcmpi(pArgV[i], TEXT("/n")) == 0) ) {
                bDoRemove = FALSE;
            }
        }
    
        //
        // Run only on Windows XP/2003 (version 5.1) or later.
        //
    
        ZeroMemory(&osvi, sizeof(OSVERSIONINFO));
        osvi.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);
    
        if (!GetVersionEx(&osvi)) {
            printf("CleanUp:  Unable to verify Windows version, exiting...\n");
            return -1;
        }
    
        if ((osvi.dwMajorVersion == 5) &&
            ((osvi.dwMinorVersion == 1) || (osvi.dwMinorVersion == 2))) {
        }
        else if (osvi.dwMajorVersion>=6) {
        }
        else
        {
            printf("CleanUp:  This utility is  designed to run on Windows XP/2003 and later\n");
            return -1;
        }
    
        ClassesToClean = DiskClassesToClean;
        ulClassesToCleanIdx = arraysize(DiskClassesToClean);
    
        for (i=0; (i<ulClassesToCleanIdx) && (bDoRemove); i++) {
    
            DeviceInfoSet = SetupDiGetClassDevs(ClassesToClean[i],
                                                NULL,
                                                NULL,
                                                0
                                                );
    
            if (INVALID_HANDLE_VALUE!=DeviceInfoSet) {
    
                DeviceInfoData.cbSize = sizeof(DeviceInfoData);
                MemberIndex = 0;
    
                while (SetupDiEnumDeviceInfo(DeviceInfoSet,
                                             MemberIndex++,
                                             &DeviceInfoData
                                             )) {
    
                    //
                    // Determine whether this device is a phantom.
                    //
                    cr = CM_Get_DevNode_Status(&Status,
                                               &Problem,
                                               DeviceInfoData.DevInst,
                                               0
                                               );
    
                    if ((cr == CR_NO_SUCH_DEVINST) ||
                        (cr == CR_NO_SUCH_VALUE)) {
                        //
                        // This is a phantom. Now get the DeviceInstanceId so we
                        // can display this as output, then delete the phantom if requested.
                        //
                        if (CM_Get_Device_ID(DeviceInfoData.DevInst,
                                             DeviceInstanceId,
                                             SIZECHARS(DeviceInstanceId),
                                             0) == CR_SUCCESS) {
    
                            if (bDoRemove) {
                                printf("DevNodePhantomCleaner:  %s will be removed.\n",
                                       DeviceInstanceId);
    
                                //
                                // Call DIF_REMOVE to remove the device's hardware
                                // and software registry keys.
                                //
                                if (SetupDiCallClassInstaller(DIF_REMOVE,
                                                              DeviceInfoSet,
                                                              &DeviceInfoData
                                                              )) {
                                    DevicesRemoved++;
                                } else {
                                    printf("CleanUp:  Error 0x%X removing phantom\n",
                                           GetLastError);
                                }
                            } else {
                                printf("CleanUp:  %s would have been removed.\n",
                                       DeviceInstanceId);
                            }
                        }
                    }
                }
    
                SetupDiDestroyDeviceInfoList(DeviceInfoSet);
            }
        }
    
        return DevicesRemoved;
    }
  8. V ponuke ladiť , a kliknite na položku Spustiť ladenie.

Ako vytvoriť Windows Server 2012 a Visual Studio 2012

Vytvoriť Windows Server 2012 a Microsoft Visual Studio 2012, postupujte nasledovne.

Poznámka:  Odporúčame, že používate DevNodeCleanpomôcka úlohy. Tieto kroky a príklad kódu v kroku 7 sú poskytované len na informačné účely.

  1. Microsoft Visual Studio 2012, kliknite na položku nový v ponuke súbor a kliknite na tlačidlo projekt.

  2. V dialógovom okne Nový projekt Čistenie zadajte názov poľa a potom dvakrát kliknite Projekt Win32.

  3. V sprievodcovi Win32 aplikácie, kliknite na tlačidlo ďalej.

  4. Podľa typu aplikácie, kliknutím vyberte Aplikáciua kliknite na tlačidlo Dokončiť.

  5. Roztok Explorer, rozbaľte Zdrojové súbory, kliknite pravým tlačidlom myši na Cleanup.cppa kliknite na tlačidlo Zobraziť kód.

  6. Vyhľadajte nasledujúci kód:

    int _tmain(int argc, _TCHAR* argv[])
    {
    return 0;
    }
    
  7. Nahradenie kódu, ktorý ste vyhľadali v kroku 6 s nasledujúcim kódom.

    //DevPhantomClnr.cpp : Defines the entry point for the console application.
    // 
     
    #include "stdafx.h"
    
    /**************************************************************************************************/     
    /*                                                                                                */     
    /* Copyright (c) 2007 Microsoft Corporation.  All Rights Reserved                                 */     
    /*                                                                                                */     
    /**************************************************************************************************/     
    
    #pragma warning( disable : 4201 ) // nonstandard extension used : nameless strut/union
    
    #include <windows.h>
    #include <stdlib.h>
    #include <stdio.h>
    #include <stddef.h>
    #include <tchar.h>
    #include <setupapi.h>
    #include <cfgmgr32.h>
    #include <initguid.h>
    #include <devguid.h>
    
    #define SIZECHARS(x) (sizeof((x))/sizeof(TCHAR))
    #define arraysize(p) (sizeof(p)/sizeof((p)[0]))
    
    CONST GUID *DiskClassesToClean[2] = {
        &GUID_DEVCLASS_DISKDRIVE,
        &GUID_DEVCLASS_VOLUME
    };
    
    /**************************************************************************************************/
    /*                                                                                                */
    /* The user must be member of Administrator group and must have backup and restore permissions         */
    /* (SE_BACKUP_NAME and SE_RESTORE_NAME). No check for these is performed in this example.              */
    /*                                                                                                */
    /**************************************************************************************************/
    int
    __cdecl
    main(
         IN int    ArgC,
         IN LPCWSTR pArgV[]
        )
    {
        HDEVINFO DeviceInfoSet;
        SP_DEVINFO_DATA DeviceInfoData;
        ULONG DevicesRemoved = 0,
              i,
              MemberIndex,
              Status, 
              Problem,
              ulClassesToCleanIdx;
        BOOL bDoRemove = TRUE;
        CONFIGRET cr;
        TCHAR DeviceInstanceId[MAX_DEVICE_ID_LEN];
        OSVERSIONINFO osvi;
        const GUID ** ClassesToClean;
    
        //
        // Parse parameters.
        //
        for (i = 1; i < (ULONG)ArgC; i++) {
            //
            // Check for help.
            //
            if ( (lstrcmpi(pArgV[i], L"-?") == 0) ||
                    (lstrcmpi(pArgV[i], L"/?") == 0) ){
    
                printf("\nDevNodePhantomCleaner will remove phantom storage device nodes from this machine.\n\n");
                printf("Usage:  nDevNodePhantomCleaner \n");
                printf("\tWhere /n displays but does not remove the phantom devnodes.\n");
                printf("\nBackup and Restore privileges are required to run this utility.\n");
                return 0;
            }
    
            //
            // Check for -n, which means just list the devices that we would remove.
            //
            if ( (lstrcmpi(pArgV[i], L"-n") == 0) ||
                 (lstrcmpi(pArgV[i], L"/n") == 0) ) {
                bDoRemove = FALSE;
            }
        }
    
        //
        // Run only on Windows XP/2003 (version 5.1) or later.
        //
    
        ZeroMemory(&osvi, sizeof(OSVERSIONINFO));
        osvi.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);
    
        if (!GetVersionEx(&osvi)) {
            printf("DevNodePhantomCleaner:  Unable to verify Windows version, exiting...\n");
            return -1;
        }
    
        if ((osvi.dwMajorVersion == 5) &&
            ((osvi.dwMinorVersion == 1) || (osvi.dwMinorVersion == 2))) {
        
        // 5.1 || 5.2
    
        }
    
        else if (osvi.dwMajorVersion>=6) {
        
        //Nothing special on 6.x
    
        }
    
        else
        {
            printf("DevNodePhantomCleaner:  This utility is  designed to run on Windows XP/2003 and later\n");
            return -1;
        }
    
        ClassesToClean = DiskClassesToClean;
        ulClassesToCleanIdx = arraysize(DiskClassesToClean);
    
        for (i=0; (i<ulClassesToCleanIdx) && (bDoRemove); i++) {
    
            DeviceInfoSet = SetupDiGetClassDevs(ClassesToClean[i],
                                                NULL,
                                                NULL,
                                                0
                                                );
    
            if (INVALID_HANDLE_VALUE!=DeviceInfoSet) {
    
                DeviceInfoData.cbSize = sizeof(DeviceInfoData);
                MemberIndex = 0;
    
                while (SetupDiEnumDeviceInfo(DeviceInfoSet,
                                             MemberIndex++,
                                             &DeviceInfoData
                                             )) {
    
                    //
                    // Determine whether this device is a phantom.
                    //
                    cr = CM_Get_DevNode_Status(&Status,
                                               &Problem,
                                               DeviceInfoData.DevInst,
                                               0
                                               );
    
                    if ((cr == CR_NO_SUCH_DEVINST) ||
                        (cr == CR_NO_SUCH_VALUE)) {
                        //
                        // This is a phantom. Now get the DeviceInstanceId so we
                        // can display this as output, then delete the phantom if requested.
                        //
                        if (CM_Get_Device_ID(DeviceInfoData.DevInst,
                                             DeviceInstanceId,
                                             SIZECHARS(DeviceInstanceId),
                                             0) == CR_SUCCESS) {
    
                            if (bDoRemove) {
                                printf("DevNodePhantomCleaner:  %ws will be removed.\n",
                                       DeviceInstanceId);
    
                                //
                                // Call DIF_REMOVE to remove the device's hardware
                                // and software registry keys.
                                //
                                if (SetupDiCallClassInstaller(DIF_REMOVE,
                                                              DeviceInfoSet,
                                                              &DeviceInfoData
                                                              )) {
                                    DevicesRemoved++;
                                } else {
                                    printf("DevNodePhantomCleaner:  Error 0x%x removing phantom\n",
                                           GetLastError());
                                }
                            } else {
                                printf("DevNodePhantomCleaner:  %ws would have been removed.\n",
                                       DeviceInstanceId);
                            }
                        }
                    }
                }
    
                SetupDiDestroyDeviceInfoList(DeviceInfoSet);
            }
        }
    
        return DevicesRemoved;
    }
  8. V roztoku Prieskumník kliknite pravým tlačidlom myši na Čisteniea kliknite na položku Vlastnosti.

  9. Rozbaľte Konfigurácia vlastnosti, rozbaľte Linkera kliknite na tlačidlo vstup.

  10. Vyberte Ďalšie závislostí, kliknite na šípku nadol a vyberte Upraviť.

  11. Ďalšie závislosti dialógové okno, typu setupapi.lib a cfgmgr32.lib.

  12. Kliknite na tlačidlo OK .

  13. Zostava projektu.

Potrebujete ďalšiu pomoc?

Chcete ďalšie možnosti?

Môžete preskúmať výhody predplatného, prehľadávať školiace kurzy, naučiť sa zabezpečiť svoje zariadenie a ešte oveľa viac.

Komunity pomôžu s kladením otázok a odpovedaním na ne, s poskytovaním pripomienok a so získavaním informácií od odborníkov s bohatými znalosťami.

Boli tieto informácie užitočné?

Aká je podľa vás jazyková kvalita textu?
Čo sa vám páčilo, prípadne čo nie?
Stlačením tlačidla Odoslať sa vaše pripomienky použijú na zlepšenie produktov a služieb spoločnosti Microsoft. Váš správca IT bude môcť tieto údaje zhromažďovať. Vyhlásenie o ochrane osobných údajov.

Ďakujeme za vaše pripomienky!

×