Моделирование низких ресурсов
Если параметр Имитация с низкими ресурсами (в Windows 8.1 называется случайным моделированием с низкими ресурсами), средство проверки драйверов завершает работу случайных экземпляров памяти драйвера, что может произойти, если драйвер работал на компьютере с недостаточным объемом памяти. Это проверяет способность драйвера правильно реагировать на нехватку памяти и другие условия с низким ресурсом.
Тест имитации низких ресурсов завершается сбоем при выделении, запрошенном вызовами нескольких различных функций, включая ExAllocatePoolWithXXX,MmGetSystemAddressForMdlSafe, MmProbeAndLockPages, MmMapLockedPagesSpecifyCache и MmMapIoSpace.
Начиная с Windows Vista, тест моделирования с низкими ресурсами также внедряет ошибки в IoAllocateIrp, IoAllocateMdl, IoAllocateWorkItem, IoAllocateErrorLogEntry, MmAllocateContiguousMemory, MmAllocateContiguousMemorySpecifyCache, MmAllocatePagesForMdl и MmAllocatePagesForMdlEx. Кроме того, начиная с Windows Vista, когда включено моделирование с низкими ресурсами, вызовы KeWaitForMultipleObjects или KeWaitForSingleObject с параметром Alertable , установленным в значение TRUE , могут возвращать STATUS_ALERTED при выполнении в контексте непривилегированных процессов. Это имитирует возможное оповещение потока, поступающее из другого потока в том же непривилегированном приложении.
Тест моделирования с низким уровнем ресурсов также внедряет ошибки в следующие функции GDI: EngAllocMem, EngAllocUserMem, EngCreateBitmap, EngCreateDeviceSurface, EngCreateDeviceBitmap, EngCreatePalette, EngCreateClip, EngCreatePath, EngCreateWnd, EngCreateDriverObj, BRUSHOBJ_pvAllocRbrush и CLIPOBJ_ppoGetPath.
В Windows 7 и более поздних версиях операционной системы Windows параметр Имитация с низкими ресурсами поддерживает память, выделенную с помощью следующих API ядра:
IoAllocateIrp и другие подпрограммы, которые могут выделять структуры данных пакета запросов ввода-вывода (IRP)
RtlAnsiStringToUnicodeString и другие строковые подпрограммы библиотеки времени выполнения (RTL)
Начиная с Windows 8.1, параметр Имитация низких ресурсов также завершается сбоем при выделении, запрошенном вызовами MmAllocateNodePagesForMdlEx. Кроме того, для некоторых функций средство проверки драйверов теперь заполняет выделенную память случайным шаблоном. Но только в ситуациях, когда функция возвращает неинициализированную память. Эти функции включают:
- MmAllocatePagesForMdlEx
- MmAllocateNodePagesForMdlEx
- MmAllocateContiguousMemory
- MmAllocateContiguousMemorySpecifyCache
- MmAllocateContiguousMemorySpecifyCacheNode
- MmAllocateContiguousNodeMemory
- MmAllocateNonCachedMemory
Пользовательские параметры для имитации низких ресурсов
В Windows Vista и более поздних версиях Windows можно указать следующие пользовательские параметры.
Вероятность того , что данное выделение завершится ошибкой. Значение по умолчанию — 6 %.
Затронутые приложения . Этот параметр ограничивает внедренные сбои выделения для указанных приложений. По умолчанию затрагиваются все выделения.
Затронутые теги пула . Этот параметр ограничивает внедренные ошибки выделениями с указанными тегами пула. По умолчанию затрагиваются все выделения.
Задержка (в минутах) перед сбоем выделения. Эта задержка позволяет системе запускаться и стабилизироваться до внедрения ошибок. Значение по умолчанию — восемь минут.
В операционных системах, предшествующих Windows Vista, эти параметры нельзя настроить. Операционная система использует значения по умолчанию.
Моделирование низких ресурсов без перезагрузки
Вы можете активировать имитацию с низкими ресурсами в Windows 2000 и более поздних версиях Windows без перезагрузки компьютера с помощью параметра /volatile . Параметры вступает в силу немедленно, но теряются при завершении работы или перезагрузке компьютера.
Вы также можете сохранить параметры имитации низких ресурсов в реестре, опустив параметр /volatile . Эти параметры действуют только при перезагрузке компьютера, но остаются в силе до тех пор, пока вы не измените их.
Активация этого параметра
Вы можете активировать параметр Имитация низких ресурсов для одного или нескольких драйверов с помощью диспетчера средств проверки драйверов или командной строки Verifier.exe. Дополнительные сведения см. в разделе Выбор параметров средства проверки драйверов.
В командной строке
В командной строке параметр Имитация низких ресурсов представлен битом 2 (0x4). Чтобы активировать имитацию с низкими ресурсами, используйте значение флагов 0x4 или добавьте 0x4 к значению флагов. Пример:
verifier /flags 0x4 /driver MyDriver.sys
Параметр будет активен после следующей загрузки.
В Windows Vista и более поздних версиях Windows можно использовать параметр /faults или значение флага 0x4 для активации имитации низких ресурсов. Чтобы изменить параметры имитации с низкими ресурсами, необходимо использовать /faults. Пример:
verifier /faults /driver MyDriver.sys
В Windows 2000 и более поздних версиях Windows можно также активировать и отключить имитацию с низкими ресурсами без перезагрузки компьютера, добавив параметр /volatile в команду . Пример:
verifier /volatile /flags 0x4 /adddriver MyDriver.sys
Этот параметр вступает в силу немедленно, но теряется при завершении работы или перезагрузке компьютера. Дополнительные сведения см. в разделе Использование переменных параметров.
В Windows Vista параметр /faults можно использовать для имитации низких ресурсов с параметром /volatile для представления параметра, действующего без перезагрузки. Будет отображено изменение параметра. Пример:
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.
Использование диспетчера проверки драйверов
- Запустите диспетчер проверки драйверов. Введите Verifier в окне командной строки.
- Выберите Создать пользовательские параметры (для разработчиков кода) и нажмите кнопку Далее.
- Выберите Выбрать отдельные параметры из полного списка.
- Выберите Имитация с низким уровнем ресурсов.
Настройка параметров (Windows Vista и более поздних версий)
Начиная с Windows Vista, вы можете изменить параметры по умолчанию для свойств тегов задержки, вероятности, приложений и пула в параметре Имитация низких ресурсов. Эти параметры можно изменить с помощью диспетчера проверки драйверов или командной строки Verifier.exe. Дополнительные сведения см. в разделе Выбор параметров средства проверки драйверов.
В командной строке для этих параметров используется следующий синтаксис:
verifier [/volatile] /faults[Probability|PoolTags|Applications|DelayMins][/driver|DriverList]
Примечание Параметры пользовательских параметров должны отображаться в указанном порядке. Если опустить значение, введите кавычки, чтобы сохранить его место.
Подпараметры
/Ошибки
Включает параметр Имитация низких ресурсов в средстве проверки драйверов. (Нельзя использовать /flags 0x4 с подпараметрами настраиваемых параметров.)
Вероятность
Указывает вероятность того, что средство проверки драйверов не сможет выполнить заданное выделение. Введите число (в десятичном или шестнадцатеричном формате), чтобы представить количество шансов в 10 000, что средство проверки драйверов не сможет выделить. Значение по умолчанию 600 означает 600/10000 или 6 %.
Теги пула
Ограничивает выделения, которые средство проверки драйверов может не выполнять с помощью указанных тегов пула. Для представления нескольких тегов пула можно использовать подстановочный знак (*). Чтобы получить список нескольких тегов пула, разделите теги пробелами. По умолчанию все выделения могут завершиться ошибкой.
Приложения
Ограничивает выделения, которые средство проверки драйверов может не выделять для указанной программы. Введите имя исполняемого файла. Чтобы получить список программ, разделите имена программ пробелами. По умолчанию все выделения могут завершиться ошибкой.
DelayMins
Указывает время в минутах после загрузки, в течение которого средство проверки драйверов не намеренно завершает выделение. Эта задержка позволяет драйверам загружаться и стабилизировать систему перед началом тестирования. Введите число (в десятичном или шестнадцатеричном формате). Значение по умолчанию — 8 (мин).
Например, следующая команда включает имитацию с низкими ресурсами с вероятностью 10 % (1000/10000) и задержкой в пять минут для тегов пула Tag1 и Fred, а также приложения Notepad.exe.
verifier /faults 1000 "Tag1 Fred" Notepad.exe 5
Следующая команда включает имитацию с низкими ресурсами со значениями по умолчанию, за исключением того, что она увеличивает задержку до 10 минут.
verifier /faults "" "" "" 0xa
Использование диспетчера проверки драйверов
Запустите диспетчер проверки драйверов. Введите Verifier в окне командной строки.
Выберите Создать пользовательские параметры (для разработчиков кода) и нажмите кнопку Далее.
Выберите Выбрать отдельные параметры из полного списка.
Выберите Имитация низких ресурсов и нажмите кнопку Далее.
При необходимости измените параметры для свойств тегов задержки, вероятности, приложений и пула.
Просмотр результатов
Вы можете отслеживать количество случаев, когда средство проверки драйверов намеренно завершается сбоем при выделении ресурсов, отображая глобальный счетчик Ошибок, внедренных в средство проверки драйверов. Этот счетчик отображает общее количество выделений ресурсов, которые средство проверки драйверов намеренно завершило сбоем с момента последней загрузки.
Этот счетчик можно просмотреть в файле журнала средства проверки драйверов (/log), в командной строке (/query) или в диспетчере проверки драйверов. В Windows 2000 для просмотра глобальных счетчиков перейдите на вкладку Глобальные счетчики . В более поздних версиях Windows выберите Отображение сведений о текущей задаче проверенных драйверов и дважды нажмите кнопку Далее . Дополнительные сведения см. в разделе Мониторинг глобальных счетчиков.
Вы также можете отобразить количество намеренно неудачных выделений и общее количество выделений (для вычисления вероятности) с помощью расширения отладчика !verifier . В следующем примере показан пример выходных данных !verifier .
В этом примере внедрение случайных сбоев API с низким уровнем ресурсов указывает на то, что включено моделирование с низкими ресурсами. Преднамеренное сбой выделения ресурсов представляет количество намеренно неудачных выделений, а попытка выделения пула — общее количество выделений.
!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
Чтобы отобразить трассировки стека для выделений, которые последний раз не удалось выполнить с помощью средства проверки драйверов, используйте !verifier 4 в отладчике ядра.
В следующем примере показан пример выходных данных из !verifier 4. По умолчанию !verifier 4 отображает трассировки стека из четырех последних неудачных выделений, но его параметр Quantity можно использовать для увеличения количества отображаемых трассировок стека. Например, 0x80 !verifier отображает 128 последних неудачных выделений.
Обратите внимание, что в этом примере Средство проверки перехватило и заменило вызов драйвера ExAllocatePoolWithTag. Одна из наиболее распространенных причин сбоя драйвера возникает, когда драйвер пытается выделить память, а затем использует указатель, возвращаемый функцией выделения, прежде чем проверять, что он не имеет значения 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
Опыт работы с тестом имитации низких ресурсов показывает, что большинство сбоев драйвера вызваны последним сбоем выделения. В приведенном выше примере авария была на пути win32k! GreEnableEUDC. Изучите код в пути к выделению, чтобы найти причину сбоя.
Сведения о !verifier см. в документации по средствам отладки для Windows .
Чтобы просмотреть параметры в реестре в командной строке, используйте параметр /querysettings . Пример:
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