Simulazione risorse basse
Quando l'opzione Simulazione risorse basse (denominata simulazione di risorse casuali in Windows 8.1) è attiva, Driver Verifier non riesce a eseguire istanze casuali delle allocazioni di memoria del driver, come potrebbe verificarsi se il driver era in esecuzione in un computer con memoria insufficiente. In questo modo viene verificata la capacità del driver di rispondere correttamente a memoria insufficiente e ad altre condizioni di risorse ridotte.
Il test Di simulazione risorse basse non supera le allocazioni richieste dalle chiamate a diverse funzioni, tra cui ExAllocatePoolWithXXX, MmGetSystemAddressForMdlSafe, MmProbeAndLockPages, MmMapLockedPagesSpecifyCache e MmMapIoSpace.
A partire da Windows Vista, il test Low Resource Simulation inserisce anche errori in IoAllocateIrp, IoAllocateMdl, IoAllocateWorkItem, IoAllocateErrorLogEntry, MmAllocateContiguousMemory, MmAllocateContiguousMemorySpecifyCache, MmAllocatePagesForMdl e MmAllocatePagesForMdlEx. Inoltre, a partire da Windows Vista, quando è abilitata la simulazione risorse ridotte, le chiamate a KeWaitForMultipleObjects o KeWaitForSingleObject con il parametro Alertable impostato su TRUE possono restituire STATUS_ALERTED quando vengono eseguiti nel contesto di processi senza privilegi. In questo modo viene simulato un possibile avviso di thread proveniente da un altro thread nella stessa applicazione senza privilegi.
Il test Low Resource Simulation inserisce anche errori nelle funzioni GDI seguenti: EngAllocMem, EngAllocUserMem, EngCreateBitmap, EngCreateDeviceSurface, EngCreateDeviceBitmap, EngCreatePalette, EngCreateClip, EngCreatePath, EngCreateWnd, EngCreateDriverObj, BRUSHOBJ_pvAllocRbrush e CLIPOBJ_ppoGetPath.
In Windows 7 e versioni successive del sistema operativo Windows, l'opzione Simulazione risorse basse supporta la memoria allocata usando le API kernel seguenti:
IoAllocateIrp e le altre routine che possono allocare strutture di dati I/O request packet (IRP)
RtlAnsiStringToUnicodeString e altre routine della libreria di runtime (RTL)
A partire da Windows 8.1, l'opzione Simulazione risorse basse non riesce anche le allocazioni richieste dalle chiamate a MmAllocateNodePagesForMdlEx. Inoltre, per alcune funzioni, Driver Verifier ora riempie la memoria allocata con un criterio casuale. Ma solo in situazioni in cui la funzione restituisce memoria non inizializzata. Queste funzioni includono:
- MmAllocatePagesForMdlEx
- MmAllocateNodePagesForMdlEx
- MmAllocateContiguousMemory
- MmAllocateContiguousMemorySpecifyCache
- MmAllocateContiguousMemorySpecifyCacheNode
- MmAllocateContiguousNodeMemory
- MmAllocateNonCachedMemory
Impostazioni personalizzate per simulazione risorse ridotte
In Windows Vista e versioni successive di Windows è possibile specificare le impostazioni personalizzate seguenti.
Probabilità che una determinata allocazione avrà esito negativo. Il valore predefinito è 6%.
Applicazioni interessate. Questa impostazione limita le allocazioni non riuscite inserite alle applicazioni specificate. Per impostazione predefinita, tutte le allocazioni sono interessate.
Tag del pool interessati. Questa impostazione limita gli errori inseriti alle allocazioni con i tag del pool specificati. Per impostazione predefinita, tutte le allocazioni sono interessate.
Ritardo (in minuti) prima che le allocazioni non siano riuscite. Questo ritardo consente all'avvio e alla stabilizzazione del sistema prima che vengano inseriti errori. Il valore predefinito è otto minuti.
Nei sistemi operativi precedenti a Windows Vista non è possibile personalizzare queste impostazioni. Il sistema operativo usa i valori predefiniti.
Simulazione risorse basse senza riavvio
È possibile attivare Simulazione risorse basse in Windows 2000 e versioni successive di Windows senza riavviare il computer usando il parametro /volatile . Le impostazioni sono effettive immediatamente, ma vengono perse se si arresta o si riavvia il computer.
È anche possibile archiviare le impostazioni Simulazione risorse basse nel Registro di sistema omettendo il parametro /volatile . Queste impostazioni sono valide solo quando si riavvia il computer, ma rimangono valide fino a quando non vengono modificate.
Attivazione di questa opzione
È possibile attivare l'opzione Simulazione risorse basse per uno o più driver usando Gestione verifica driver o la riga di comando Verifier.exe. Per informazioni dettagliate, vedere Selezione delle opzioni di verifica driver.
Nella riga di comando
Nella riga di comando l'opzione Simulazione risorse basse è rappresentata da Bit 2 (0x4). Per attivare Simulazione risorse basse, usare un valore flag di 0x4 o aggiungere 0x4 al valore dei flag. Ad esempio:
verifier /flags 0x4 /driver MyDriver.sys
L'opzione sarà attiva dopo l'avvio successivo.
In Windows Vista e versioni successive di Windows è possibile usare il parametro /faults o il valore flags di 0x4 per attivare Simulazione risorse basse. Per modificare le impostazioni per Simulazione risorse ridotte, è necessario usare /faults. Ad esempio:
verifier /faults /driver MyDriver.sys
In Windows 2000 e versioni successive di Windows è anche possibile attivare e disattivare Simulazione risorse ridotte senza riavviare il computer aggiungendo il / volatile parametro al comando . Ad esempio:
verifier /volatile /flags 0x4 /adddriver MyDriver.sys
Questa impostazione è effettiva immediatamente, ma viene persa quando si arresta o si riavvia il computer. Per informazioni dettagliate, vedere Uso delle impostazioni volatili.
In Windows Vista è possibile usare il parametro /faults per rappresentare La simulazione risorse basse con il parametro /volatile per rappresentare un'impostazione efficace senza riavviare. Verrà visualizzata la modifica dell'impostazione. Ad esempio:
0> verifier /volatile /faults /adddriver MyDriver.sys New Low Resources Simulation options: - Use default fault injection probability. - Allocations using any pool tag can be failed. - Simulate low resources conditions in any application. The new settings are in effect until you restart this computer or change them again.
Uso di Gestione verifica driver
- Avviare Gestione verifica driver. Digitare Verifier in una finestra del prompt dei comandi.
- Selezionare Crea impostazioni personalizzate (per sviluppatori di codice) e quindi fare clic su Avanti.
- Selezionare Seleziona singole impostazioni da un elenco completo.
- Selezionare Simulazione risorse basse.
Personalizzazione delle impostazioni (Windows Vista e versioni successive)
A partire da Windows Vista, è possibile modificare le impostazioni predefinite per le proprietà dei tag delay, probability, applications e pool dell'opzione Simulazione risorse basse. È possibile modificare queste impostazioni usando Gestione verifica driver o la riga di comando Verifier.exe. Per informazioni dettagliate, vedere Selezione delle opzioni di verifica driver.
Nella riga di comando la sintassi per queste impostazioni è la seguente:
verifier [/volatile] /faults[Probability|PoolTagsApplications|DelayMins|][/driver|DriverList]
Nota I parametri delle impostazioni personalizzate devono essere visualizzati nell'ordine visualizzato. Se si omette un valore, digitare le virgolette per trattenerne la posizione.
Sottoparametri
/Difetti
Abilita l'opzione Simulazione risorse basse in Driver Verifier. Non è possibile usare /flags 0x4 con i sottoparametri dell'impostazione personalizzata.
Probabilità
Specifica la probabilità che Driver Verifier non riuscirà a una determinata allocazione. Digitare un numero (in formato decimale o esadecimale) per rappresentare il numero di probabilità in 10.000 che Driver Verifier non riuscirà l'allocazione. Il valore predefinito, 600, indica 600/10000 o 6%.
PoolTags
Limita le allocazioni che Driver Verifier può non riuscire ad allocazioni con i tag del pool specificati. È possibile usare un carattere jolly (*) per rappresentare più tag del pool. Per elencare più tag del pool, separare i tag con gli spazi. Per impostazione predefinita, tutte le allocazioni possono avere esito negativo.
Applicazioni
Limita le allocazioni che Driver Verifier può non riuscire ad allocazioni per il programma specificato. Digitare il nome di un file eseguibile. Per elencare i programmi, separare i nomi dei programmi con spazi. Per impostazione predefinita, tutte le allocazioni possono avere esito negativo.
DelayMins
Specifica il numero di minuti dopo l'avvio durante il quale il verificatore driver non ha intenzionalmente esito negativo in alcuna allocazione. Questo ritardo consente ai driver di caricare e il sistema di stabilizzarsi prima dell'inizio del test. Digitare un numero (in formato decimale o esadecimale). Il valore predefinito è 8 (minuti).
Ad esempio, il comando seguente abilita La simulazione di risorse basse con probabilità del 10% (1000/10000) e un ritardo di cinque minuti per i tag del pool, Tag1 e Fred e l'applicazione, Notepad.exe.
verifier /faults 1000 "Tag1 Fred" Notepad.exe 5
Il comando seguente abilita La simulazione di risorse basse con i valori predefiniti, ad eccezione del fatto che estende il ritardo a 10 minuti.
verifier /faults "" "" "" 0xa
Uso di Gestione verifica driver
Avviare Gestione verifica driver. Digitare Verifica in una finestra del prompt dei comandi.
Selezionare Crea impostazioni personalizzate (per gli sviluppatori di codice) e quindi fare clic su Avanti.
Selezionare Seleziona singole impostazioni da un elenco completo.
Selezionare Simulazione risorse basse e quindi fare clic su Avanti.
Modificare le impostazioni per le proprietà di tag di ritardo, probabilità, applicazioni e pool in base alle esigenze.
Visualizzazione dei risultati
È possibile monitorare il numero di volte in cui Il verificatore driver ha intenzionalmente esito negativo nelle allocazioni delle risorse visualizzando il contatore globale inserito dagli errori di verifica driver. Questo contatore visualizza il numero totale di allocazioni di risorse che Il verificatore driver ha avuto esito negativo intenzionalmente dall'ultimo avvio.
È possibile visualizzare questo contatore in un file di log del verificatore driver (/log), nella riga di comando (/query) o in Gestione verifica driver. In Windows 2000, per visualizzare i contatori globali, selezionare la scheda Contatori globali . Nelle versioni successive di Windows selezionare Visualizza informazioni sull'attività driver attualmente verificati e quindi premere Avanti due volte. Per altre informazioni, vedere Monitoraggio dei contatori globali.
È anche possibile visualizzare il numero di allocazioni intenzionalmente non riuscite e il numero di allocazioni totali (per calcolare la probabilità) usando l'estensione del debugger !verifier . Nell'esempio seguente viene illustrato un esempio dell'output del verificatore ! .
In questo esempio, iniettare errori di API a bassa risorsa casuali indica che è abilitata la simulazione di risorse basse. Le allocazioni delle risorse non riuscite rappresentano intenzionalmente il numero di allocazioni intenzionalmente non riuscite e allocazioni di pool tentate rappresenta il numero totale di allocazioni.
!verifier
Verify Level 5 ... enabled options are:
Special pool
Inject random low-resource API failures
Summary of All Verifier Statistics
RaiseIrqls 0x2c671f
AcquireSpinLocks 0xca1a02
Synch Executions 0x10a623
Trims 0x0
Pool Allocations Attempted 0x862e0e
Pool Allocations Succeeded 0x8626e3
Pool Allocations Succeeded SpecialPool 0x768060
Pool Allocations With NO TAG 0x0
Pool Allocations Failed 0x34f
Resource Allocations Failed Deliberately 0x3f5
Per visualizzare le tracce dello stack per le allocazioni di recente non riuscite da Driver Verifier, usare !verifier 4 nel debugger del kernel.
Nell'esempio seguente viene illustrato un esempio dell'output di !verifier 4. Per impostazione predefinita, !verifier 4 visualizza le tracce dello stack dalle quattro allocazioni non riuscite di recente, ma è possibile usare il parametro Quantity per aumentare il numero di tracce dello stack visualizzate. Ad esempio, !verifier 0x80 visualizza le 128 allocazioni più recenti non riuscite.
In questo esempio si noti che Verifier ha intercettato e sostituito la chiamata del driver a ExAllocatePoolWithTag. Una delle cause più comuni degli arresti anomali del driver si verifica quando un driver tenta di allocare memoria e quindi usa il puntatore restituito dalla funzione di allocazione prima di verificare che non sia NULL.
kd> !verifier 4
Resource fault injection history:
Tracker @ 8354A000 (# entries: 80, size: 80, depth: 8)
Entry @ 8354B258 (index 75)
Thread: C2638220
816760CB nt!VerifierExAllocatePoolWithTag+0x49
A4720443 win32k!bDeleteAllFlEntry+0x15d
A4720AB0 win32k!GreEnableEUDC+0x70
A47218FA win32k!CleanUpEUDC+0x37
A473998E win32k!GdiMultiUserFontCleanup+0x5
815AEACC nt!MiDereferenceSession+0x74
8146D3B4 nt!MmCleanProcessAddressSpace+0x112
815DF739 nt!PspExitThread+0x603
Entry @ 8354B230 (index 74)
Thread: 8436D770
816760CB nt!VerifierExAllocatePoolWithTag+0x49
A462141C win32k!Win32AllocPool+0x13
A4725F94 win32k!StubGdiAlloc+0x10
L'esperienza con il test di simulazione di risorse basse rivela che la maggior parte degli arresti anomali del driver è causata dall'allocazione più recente non riuscita. Nell'esempio precedente, l'arresto anomalo si trovava nel percorso di win32k! GreEnableEUDC. Esaminare il codice nel percorso dell'allocazione per individuare la causa dell'arresto anomalo.
Per informazioni sul verificatore !, vedere la documentazione degli strumenti di debug per Windows .
Per visualizzare le impostazioni nel Registro di sistema nella riga di comando, usare l'opzione /querysettings . Ad esempio:
C:\>verifier /querysettings
Special pool: Disabled
Pool tracking: Disabled
Force IRQL checking: Disabled
I/O verification: Disabled
Enhanced I/O verification: Disabled
Deadlock detection: Disabled
DMA checking: Disabled
Security checks: Disabled
Force pending I/O requests: Disabled
Low resources simulation: Enabled
IRP Logging: Disabled
Miscellaneous checks: Disabled
Low Resources Simulation options:
- Fault injection probability: 1/10000.
- Fail only allocations using pool tags: Tag1 Tag2.
- Simulate low resources conditions only in applications: test1.exe test2.exe.
- Boot time delay: 2 minutes.
Verified drivers:
blah.sys