Kuidas eemaldada seadmeid, mis kunagi uuesti kasutada registriteave

SISSEJUHATUS

Kui mäluseadme on ühendatud Windows, isegi kui ainult korraks, loob windows registri teave seadme. Aja jooksul register võib olla palju kirjeid seadmeid, mis kunagi uuesti kasutada. Selles artiklis kirjeldatakse, kuidas eemaldada see teave süsteemi registri.

On tarkvara, mis loob mäluseade ja aknad korralikult puhastada teavet seadme vaheline ühendus. See protsess on vajalik, kuna Windows ei tea, kui mäluseadme eemaldatakse jäädavalt või ajutiselt. Kuid tarkvara, mis loob ühenduse tavaliselt teavad seda. Näiteks kui tarkvara paigaldus loogilise üksuse numbrit (LUNs) varundamiseks ja seejärel unmounting LUNs, oleks vastutuse backup tarkvara puhastada LUN teavet Windows, sest sama mäluseade ei saa enam Windowsi uuesti kasutada.

Lisateabe saamiseks

Kui uus seade on ühendatud arvutiga Windowsi kirjed teavet seadme süsteemi registris. Enamiku seadmete puhul ei ole see protseduur tekitada probleeme. Siiski pärast seda, kui mäluseadme on esitanud LUN kiu kanali kaudu või iSCSI, seade võib kunagi tekkida uuesti arvuti. Näiteks võib seade tuvastanud seerianumber või 0x80 ja 0x83 SCSI leheküljel.

Sellises olukorras register võib sisaldada kirjeid korral ei kuvata uuesti. Mitte ainult need kirjed ei hõivata ruumi registris, need kirjed lõpuks võib põhjustada probleeme. Näiteks kuna registrite Plug and Play funktsiooni kasutamiseks neljakohaline decimal väärtused probleem võib ilmneda 10,001 seade.

Lahenda see piirang Plug and Play funktsioone, võite seadme teabe eemaldamiseks registrist, kui seade on arvuti kõvakettale, mis pole enam olemas. Saate seda teha, kasutades DevNodeCleankasulikkust.

Kuidas luua Windows Server 2003, Windows Server 2008, Windows Server 2008 R2 ja Visual Studio 2005

Puhastada register GUID_DEVCLASS_DISKDRIVE ketta klassi GUID-i ja selle GUID_DEVCLASS_VOLUME ketta klassi GUID, toimige järgmiselt.

Märkus. Soovitame kasutada utiliiti selle ülesande. Järgmised sammud ja koodi näited juhises 7 esitatud ainult teavitamise eesmärgil.

  1. Helistada SetupDiGetClassDevs funktsiooni klassi, mis on seotud GUID-i teavet.

  2. Helistada SetupDiEnumDeviceInfo funktsiooni eksemplari praeguse klassi iga seadme kohta teabe saamiseks.

  3. Kõne CM_Get_DevNode_Status funktsiooni, et näha, kas praeguse seadme teave puudub seadme. Tehke kindlaks, kas funktsiooni olek on võrdne CR_NO_SUCH_DEVINST või CR_NO_SUCH_VALUE.

  4. Puudub seadme, helistage CM_Get_Device_ID funktsiooni saamiseks seadme eksemplari ID-d ja ID kuvamiseks enne selle teabe eemaldamine.

  5. Puudub seadme jaoks kasutada klassi 1. sammus saadud teave ja eksemplari 2. sammus saadud teave. Helistada SetupDiCallClassInstaller (DIF_REMOVE...) funktsiooni teabe eemaldamiseks registrist.

  6. Kui praegune klassi seadmed on käsitletud, helistada SetupDiDestroyDeviceInfoList funktsiooni puhastada.

Märkus. Mõnel juhul tuleb puhastada registrit, mitte ainult, sest GUID_DEVCLASS_DISKDRIVE ja GUID_DEVCLASS_VOLUME disk klassi GUID-d, aga ka jaoks GUID_DEVCLASS_SCSIADAPTER ja GUID_DEVCLASS_VOLUMESNAPSHOT disk klassi GUID-d. Selleks peate muutma järgmine näidiskood DiskClassesToClean määratlus.

Järgmine Win32 konsooli rakendus on rakendus, mis kustutatakse registri näide. Selle rakenduse kasutamiseks toimige järgmiselt.

Microsoft pakub programmeerimisnäiteid ainult artikli illustreerimiseks ilma igasuguse otsese või kaudse garantiita. See hõlmab, kuid ei piirdu kaudseid garantiisid turustatavuse või kindlaks otstarbeks sobivusega. See artikkel eeldab, et olete demonstreeritava programmeerimiskeelega programmeerimise keel ning luua protseduuride ja silumiseks kasutatavate tööriistadega tuttav. Microsofti tugitehnikud võivad aidata mõne konkreetse protseduuri talitlust selgitada. Siiski ei muuda nad neid näiteid lisafunktsioonide pakkumiseks ega Koosta vastavaid protseduure teie konkreetsetele nõuetele.

  1. Microsoft Visual Studio 2005, menüü fail käsku Uus ja klõpsake projekti.

  2. Laiendage Visual C++ja klõpsake Win32.

  3. Klõpsake Win32 konsooli rakendus, tüüp puhastamine väljale nimi ja seejärel klõpsake nuppu OK.

  4. Klõpsake nuppu FinishWin32 Application Wizard dialoogiboksis.

  5. Lahenduste Explorer, laiendage Lähtefailide, paremklõpsake Cleanup.cppja seejärel nuppu Kuva kood.

  6. Otsige üles järgmine kood:

    int _tmain(int argc, _TCHAR* argv[])
    {
    return 0;
    }
    
  7. Asendage järgmine kood juhises 6 leitud koodi.

    /**************************************************************************************************/     
    /*                                                                                                */     
    /* 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. Klõpsake menüüd siluda ja klõpsake Start silumine.

Kuidas luua Windows Server 2012 ja Visual Studio 2012

Looge Windows Server 2012 ja Microsoft Visual Studio 2012, toimige järgmiselt.

Märkus. Soovitame kasutada utiliiti selle ülesande. Järgmised sammud ja koodi näited juhises 7 esitatud ainult teavitamise eesmärgil.

  1. Microsoft Visual Studio 2012 menüü fail käsku Uus ja klõpsake projekti.

  2. Dialoogiboksis Uus projekt tüüp puhastamine välja nimi ja topeltklõpsake Win32 projekti.

  3. Win32 rakendus viisardis klõpsake Järgmine.

  4. Jaotises Tüüpvalige Konsooli rakendusja klõpsake nuppu Finish.

  5. Lahenduste Explorer, laiendage Lähtefailide, paremklõpsake Cleanup.cppja seejärel nuppu Kuva kood.

  6. Otsige üles järgmine kood:

    int _tmain(int argc, _TCHAR* argv[])
    {
    return 0;
    }
    
  7. Asendage järgmine kood juhises 6 leitud koodi.

    //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. Aknas lahenduste Explorer, paremklõpsake Cleanupja seejärel suvandil Atribuudid.

  9. Laienda Konfiguratsiooni atribuudid, laiendage Linkerja klõpsake sisend.

  10. Valige Täiendavad sõltuvused, klõpsake noolt ja valige muuta.

  11. Dialoogiboksi Täiendavad sõltuvused , tippige setupapi.lib ja cfgmgr32.lib.

  12. Klõpsake kaks korda nuppu OK .

  13. Projekti luua.

Kas vajate veel abi?

Täiendage oma oskusi
Tutvuge koolitusmaterjalidega
Kasutage uusi funktsioone enne teisi
Liitu Microsofti Insideri programmis osalejad

Kas sellest teabest oli abi?

Täname tagasiside eest!

Täname tagasiside eest! Tundub, et võiksime teid kokku viia ühega meie Office'i tugiagentidest, kes aitab teil probleemi lahendada.

×