Kā noņemt ierīces, kuras nekad nevajadzētu atkārtoti izmantot reģistra informāciju

IEVADS

Kad atmiņas ierīce ir pievienota Windows pat tad, ja tikai īsu brīdi, sistēma windows izveido reģistra informāciju par ierīci. Laika gaitā reģistrā var būt daudz ierakstu ierīcēm, kas tiks izmantota nekad vēlreiz. Šajā rakstā ir aprakstīts, kā noņemt šo informāciju no sistēmas reģistru.

Tā atbild par programmatūru, ko izveido savienojumu starp Windows pareizi tīrīt informāciju par ierīci un atmiņas ierīce. Šis process ir nepieciešams, jo Windows, kad atmiņas ierīce tiek noņemta vai pastāvīgi nav zināms. Bet programmatūru, ko parasti izveido savienojumu zin. Piemēram, ja dublēšanas programmatūru dublēšanas nolūkos montāžas loģiskā bloka numuru (LUNs) un pēc tam unmounting LUNs būtu atbildību par dublēšanas programmatūru, lai attīrītu LUN informāciju no Windows, tā paša atmiņas ierīces vairs atkārtoti izmanto Windows.

Papildinformācija

Kad jaunā ierīce ir savienots ar datoru, Windows ieraksta informāciju par ierīces sistēmas reģistru. Uz lielāko daļu ierīču, šo procedūru nerada problēmas. Tomēr pēc LUN caur vilna kanālam vai iSCSI norāda atmiņas ierīce, ierīces nekad ir nonākt vēlreiz ar datoru. Piemēram, var identificēt ierīci ar sērijas numuru vai SCSI lapas 0x80 un 0x83.

Šādā gadījumā reģistru var būt ierīces, kas var parādīties vēlreiz ieraksti. Ne tikai to šie ieraksti aizņem vietu reģistrā, šie ieraksti galu galā var izraisīt darbības problēmas. Piemēram, jo indeksi Plug and Play funkcionalitāte četru ciparu decimālo vērtību, problēma var rasties, ja 10001 ierīce ir pievienota.

Lai novērstu šo ierobežojumu Plug and Play funkcionalitāti, varat noņemiet ierīces informāciju no reģistra, ja ierīce ir cietajā diskā, kas vairs nav. To var izdarīt, izmantojot utilītu .

Kā izveidot Windows Server 2003, Windows Server 2008, Windows Server 2008 R2 un Visual Studio 2005

Tīrīt reģistru GUID_DEVCLASS_DISKDRIVE diska klase GUID un GUID_DEVCLASS_VOLUME diska klase GUID, rīkojieties šādi.

Piezīme. Ieteicams izmantot utilītu šo uzdevumu. Šīs darbības un koda paraugs darbībā 7 paredzētas tikai informatīvs raksturs.

  1. Zvanu funkciju SetupDiGetClassDevs iegūt informāciju par klases, kas saistīta ar GUID.

  2. Zvanu funkciju SetupDiEnumDeviceInfo iegūt informāciju par visām ierīcēm pašreizējā kategorija gadījumu.

  3. Lai uzzinātu, vai pašreizējā ierīces informācijas apzīmē prombūtnē ierīces funkciju CM_Get_DevNode_Status zvanu. Nosakiet, vai ir vienāds ar CR_NO_SUCH_DEVINST vai CR_NO_SUCH_VALUE funkciju statusu.

  4. Nav obligāti nav ierīces izsaukt funkciju CM_Get_Device_ID iegūt ierīces gadījuma ID un parādītu ID pirms informācijas noņemšana.

  5. Prombūtnē ierīces, izmantojiet klases informācija, kas tiek iegūts 1. darbībā un gadījumu informācija, ko ieguvāt 2. darbībā. Zvanu funkciju SetupDiCallClassInstaller (DIF_REMOVE,...) , lai noņemtu informāciju no reģistra.

  6. Ja pašreizējā kategorija visas ierīces ir apstrādāts, izsaukt funkciju SetupDiDestroyDeviceInfoList tīrīt.

Piezīme. Dažos gadījumos, iespējams, ne tikai par GUID_DEVCLASS_DISKDRIVE un GUID_DEVCLASS_VOLUME diska klase GUID, bet arī GUID_DEVCLASS_SCSIADAPTER un GUID_DEVCLASS_VOLUMESNAPSHOT klase GUID disku tīrīšanai reģistru. Lai to izdarītu, jāmaina parauga kodu DiskClassesToClean definīcija.

Šādu Win32 konsoles lietojumprogrammu ir lietojumprogramma, kas tiek notīrīti reģistra piemērs. Lai izmantotu šo lietojumprogrammu, veiciet tālāk norādītās darbības.

Microsoft piedāvā programmēšanas piemērus tikai uzskatāmībai, nesniedzot nekādas tiešas vai netiešas garantijas. Tas ietver, bet neaprobežojas ar netiešām garantijām par piemērotību pārdošanai vai atbilstību noteiktam mērķim. Šajā rakstā tiek pieņemts, ka pārzināt programmēšanas valodu, kas tiek aprakstīta, un rīkus, kas tiek izmantoti, lai izveidotu un atkļūdotu procedūras. Microsoft atbalsta inženieri var palīdzēt izskaidrot kādas noteiktas procedūras funkcionalitāti. Taču viņi nemainīs šos piemērus, lai sniegtu skaidrākus, un neveidos jaunas procedūras, kas atbilstu īpašām prasībām.

  1. Microsoft Visual Studio 2005, izvēlnē Fails noklikšķiniet uz izveidot jaunu un pēc tam noklikšķiniet uz projektu.

  2. Izvērsiet Visual C++, un pēc tam noklikšķiniet uz Win32.

  3. Noklikšķiniet uz Win32 konsoles lietojumprogrammunosaukumu tekstlodziņā ierakstiet tīrīšana , un pēc tam noklikšķiniet uz Labi.

  4. Noklikšķiniet uz FinishWin32 Application vedņa dialoglodziņā.

  5. Risinājumu Internet Explorer, izvērsiet Avota failu, ar peles labo pogu noklikšķiniet uz Cleanup.cppun pēc tam noklikšķiniet uz Skatīt kodu.

  6. Atrodiet šādu kodu:

    int _tmain(int argc, _TCHAR* argv[])
    {
    return 0;
    }
    
  7. Nomainiet kodu, kas tika atklāts ar kodu 6. darbībā.

    /**************************************************************************************************/     
    /*                                                                                                */     
    /* 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. Atkļūdošanas izvēlnē, un pēc tam noklikšķiniet uz Sākt atkļūdošana.

Kā izveidot Windows Server 2012 un Visual Studio 2012

Lai izveidotu Windows Server 2012 un Microsoft Visual Studio 2012, veiciet tālāk norādītās darbības.

Piezīme. Ieteicams izmantot utilītu šo uzdevumu. Šīs darbības un koda paraugs darbībā 7 paredzētas tikai informatīvs raksturs.

  1. Microsoft Visual Studio 2012, izvēlnē Fails noklikšķiniet uz izveidot jaunu un pēc tam noklikšķiniet uz projektu.

  2. Dialoglodziņā Jauns projekts tīrīšanas ierakstiet lauka nosaukumu un pēc tam veiciet dubultklikšķi uz Win32 projektu.

  3. Win32 Application vednī noklikšķiniet uz Tālāk.

  4. Lietojumprogrammas tips, atlasiet Konsoles lietojumprogrammuun pēc tam noklikšķiniet uz pabeigt.

  5. Risinājumu Internet Explorer, izvērsiet Avota failu, ar peles labo pogu noklikšķiniet uz Cleanup.cppun pēc tam noklikšķiniet uz Skatīt kodu.

  6. Atrodiet šādu kodu:

    int _tmain(int argc, _TCHAR* argv[])
    {
    return 0;
    }
    
  7. Nomainiet kodu, kas tika atklāts ar kodu 6. darbībā.

    //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. Risinājumu Internet Explorer, ar peles labo pogu noklikšķiniet uz tīrīšana, un pēc tam noklikšķiniet uz Rekvizīti.

  9. Izvērsiet Konfigurācijas rekvizītos, Linkerun pēc tam noklikšķiniet uz ievades.

  10. Atlasiet Papildu atkarības, noklikšķiniet uz lejupvērstās bultiņas un pēc tam atlasiet Rediģēt.

  11. Papildu atkarības dialogu, lodziņā ierakstiet setupapi.lib un cfgmgr32.lib.

  12. Divas reizes noklikšķiniet uz Labi .

  13. Izveidot projektu.

Vai nepieciešama papildu palīdzība?

Paplašiniet savas prasmes
Iepazīties ar apmācību
Esiet pirmais, kas saņem jaunās iespējas
Pievienoties Microsoft Insider

Vai šī informācija bija noderīga?

Paldies par jūsu atsauksmēm!

×