Управление электропитанием в Windows. Управление электропитанием в Windows что означает вызов специального скрипта для связи VC с DDK

Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже

Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.

Размещено на http://www.allbest.ru/

1. Теоретические сведения

1.1 Разработка драйверов ядра Windows

Краткие теоретические сведения

Разработка драйверов ядра

Драйвер (от англ. driver) - это компьютерная программа, с помощью которой другая программа (обычно, операционная система) получает доступ к аппаратному обеспечению стандартным образом.

Схематично, чтобы показать, как работают разные типы драйверов:

Удобно разделить на 2 типа:

- Драйверы ядра (работают на 0 уровне привилегий, но никак не взаимодействуют ни с программой пользователя, ни с устройством. Именно с них мы и начнем (они проще и тоже могут принести пользу).

Драйверы устройств - необходимы, чтобы осуществлять взаимодействие между программой пользователя и устройством, а именно, передавать данные между ними, управлять устройством. Причем, устройства могут быть как реальными, так и виртуальными). Драйвер не обязательно должен управлять каким-нибудь физическим устройством. Некоторые ОС дают возможность создавать также драйверы виртуальных устройств - объектов, которые ведут себя аналогично устройствам в/выв, но не отвечают никакому физическому устройству.

Компоненты ядра выполняются в привилегированном режиме процессора (называемом режимом ядра), могут выполнять все, а именно:

- они могут выполнять привилегированные команды процессора (например, lgdt),

- могут иметь доступ к системным данным и коду,

- имеют прямой доступ к оборудованию, например, через порты

- имеют доступ к ячейкам памяти; драйвер не может манипулировать физической памятью напрямую, однако может получить виртуальный адрес для любого физического и манипулировать им.

Если требуется написать сколь-нибудь серьезное приложение, для работы которого необходим доступ к внутренним функциям или структурам данных системы, то можно столкнуться со множеством ограничений, преодолеть которые можно только разместив свой код в системном адресном пространстве. Из документированных существует только один способ это сделать - установить драйвер. Способ этот относительно прост, надежен, а главное, полностью обеспечен поддержкой со стороны самой операционной системы.

Код ядра (собственно это и есть сама система) рассматривается как полностью доверительный. Поэтому, будучи загруженным в системное адресное пространство, драйвер становится частью системы и на него не накладываются какие-либо ограничения. В Windows - это практически единственный способ не разработчикам ОС писать системные компоненты уровня ядра.

Для написания и изучения способов разработки драйверов применяют DDK (Device Development Kit) - систему для разработки драйверов.

Помимо документации в DDK входит набор включаемых файлов (*.inc) и библиотечных файлов (*.lib).

Таким образом, Windows поддерживают различные типы драйверов устройств, но, кроме того, существуют драйверы, которые не являются драйверами устройств, а просто позволяют создавать программы, которые в Windows будут работать в режиме ядра, т.е. на 0 уровне привилегий. При этом они полностью получают доступ к ОС и оборудованию.

Рассмотрим самый простой драйвер режима ядра.

#include

int DriverEntry(

IN PDRIVER_OBJECT pDriverObject,

IN PUNICODE_STRING pusRegistryPath) {

}

Точкой входа является DriverEntry, которая оформлена в виде процедуры, принимающей два параметра:

pDriverObject - указатель на объект только что созданного драйвера. Загружая драйвер, система создает объект "драйвер" (driver object), представляющий для нее образ драйвера в памяти. Через этот объект система управляет драйвером. Объект "драйвер" представляет собой обыкновенную структуру данных типа DRIVER_OBJECT.

pusRegistryPath - указатель на раздел реестра, содержащий параметры инициализации драйвера.

Этот наш первый драйвер только загружается в систему и тут же выгружается.

Теперь рассмотрим программу-шаблон, которую нужно будет использовать для разработки программы на первом шаге курсовой работы (драйвер режима ядра beeper.sys).

Задача этого драйвера - исполнять на системном динамике одну ноту до первой октавы. Для этого драйвер использует инструкции процессора in и out, обращаясь к соответствующим портам ввода-вывода. Общеизвестно, что доступ к портам ввода-вывода - это свято охраняемый Windows системный ресурс. Попытка обращения к любому из них, как на ввод, так и на вывод, из режима пользователя, неизбежно приводит к появлению исключения.

В нашем примере будет работать динамик (для этого используется, в частности, порт 61h, 0 и 1 биты, порт 43h и 42h).

В начале драйвера определены все 12 нот.

Нужно будет не просто включить динамик, а установить частоту звука. Для этого используется подсистема таймера, которая работает независимо от процессора и имеет 3 канала. Выход канала 2 связан с динамиком, который используется для генерации звука разной частоты. Слышимый диапазон звука - 30Гц-6000Гц.

Чтобы задать частоту звука, в порт 43h (регистр команд таймера) посылается управляющее слово 0Bh:

mov al,0Bh

out 43h,al

Это значение определяет номер канала, которым мы будем управлять, тип операции, режим работы канала и формат счетчика.

Затем в порт 42h посылается пересчитанная частота звука (1193167/частоту (Гц)) двумя порциями (сначала младшая часть, затем - старшая).

Например, мы хотим получить частоту звука в 100Гц. Пересчитываем частоту,

1193167/100 = 11931

Затем:

mov ax,11931

out 42h,al

mov al,ah

out 42h,al

На первом шаге курсовой работы необходимо изменить программу так, чтобы она выдавала другие музыкальные звуки (у каждого по варианту).

Зачастую в заданиях нужно задавать разные длительности. Для этого удобно использовать процедуру DO_DELAY, передав в нее косвенно определенный параметр "время звучания".

Чтобы было удобно отлаживать драйвер, существуют различные средства. Самое простое - осуществлять вывод необходимой информации в специальное окно утилиты Debug View. Предварительно эта программа запускается, настраивается на перехват сообщений с уровня ядра. Для вывода в программе вызывается функция DbgPrint, имеющая один параметр - выводимую строку. После запуска драйвера в окне Debug View отображается весь вывод.

Существуют различные способа установки драйвера в ядро. Так как наш драйвер, вообще-то, системе не нужен (он не руководит никаким устройством), то мы будем временно подключать драйвер к системе, а затем его удалять.

Для этого необходимо создать приложение, которое будет запускать драйвер. Каким образом? Драйвер - это служба уровня ядра. Поэтому приложение будет использовать SCM - Диспетчер управления службами (Service Control Manager), который входит в состав Windows и работает на пользовательском уровне.

Таким образом, необходимо построить решение из двух проектов: консольное приложение и драйвер.

Для разработки драйверов на С нужно предварительно:

- проинсталлировать DDK,

- установить переменную среды WNETBASE (значение - путь к DDK, например, e:\winddk\3790.1830).

Проект с драйвером должен быть типа MakeFile.

Сделать настройки проекта с помощью Application Settings и в поле Build Command Line записать строку

ddkbuild -WNETXP chk . -ceZ

что означает вызов специального скрипта для связи VC с DDK

В текущей папке проекта должны присутствовать файлы:

sources, makefile, ddkbuild.cmd (скрипт), исходный файл драйвера.c

После построения проекта драйвер должен иметь расширение.sys.

Приложение запускает драйвер beeper.sys, т.е. прописывает его в реестре, и запускает в работу. Затем по окончании удаляет из реестра.

Чтобы приложение могло запустить драйвер, после построения решения, которое состоит из двух проектов - приложения и драйвера, нужно поместить исполнимый файл приложения и драйвер в одну папку, а затем запустить приложение.

Драйверы очень трудно отлаживать. При ошибках в работе ОС чаще всего зависает, и требуется перезагрузка. А для нашего драйвера после перезагрузки еще и необходимо удалить службу beeper06 из реестра с помощью regedit (HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\), а потом снова перезагрузиться.

1.2 Драйверы виртуальных устройств Windows

До сих пор мы разрабатывали драйвер режима ядра, который может делать то, что нельзя на пользовательском уровне, в частности, работать с портами в/выв. Такой драйвер называется драйвером ядра, но не драйвером устройства, потому что не передаются данные между программой пользователя и устройством (Драйвер ведь обычно зачем нужен? Чтобы организовывать обмен данными между приложением пользователя и устройством).

Сейчас мы будем разрабатывать драйверы устройств, которые передают данные туда и обратно между приложением пользователя и устройством.

Когда приложению требуется операция в/выв, то происходит обращение к драйверу. Для этого приложение может давать запрос на чтение данных из устройства или запись данных на устройство. А если требуется какое-то другое действие, например, опрос или управление устройством, либо что-либо другое, то для этого используется т.н. IOCTL-интерфейс (Device In-Out Control).

Мы будем рассматривать именно такой случай для виртуальных устройств, потому что чаще всего, зачем нужно виртуальное устройство в драйвере? Чтобы можно было передавать ему данные, которые драйвер может как-то обработать (как нельзя в приложении) и вернуть в приложение результат. Вспомним, что обычный драйвер ядра, рассмотренный ранее, ничего не брал из приложения и ничего туда не возвращал, а просто делал действия, недоступные приложению.

Когда приложению требуется операция в/выв, то происходит обращение к драйверу. Для этого может использоваться т.н. IOCTL-интерфейс (Device In-Out Control).

Вызывающее приложение выполняет следующие действия:

1) Открытие файла и получение его дескриптора:

GENERIC_READ + GENERIC_WRITE, 0, NULL, OPEN_EXISTING, 0, NULL

В результате, если все произошло успешно, мы получаем дескриптор устройства.

2) Посылка драйверу кода действия (что делать, драйвер может реализовывать много различных действий):

invoke DeviceIoControl, дескриптор, код действия, адрес входного буфера, размер входных данных, адрес выходного буфера, размер выходных данных, адрес буфера для реального количества байтов

3) Закрытие файла и, соответственно, освобождение дескриптора.

invoke CloseHandle дескриптор устройства

Чтобы передавать данные, модули (приложение и драйвер) должны договориться о протоколе взаимодействия (коды действий, структура буферов - входных и выходных).

Такой же код действия используется и в приложении, и в драйвере.

Код действия в приложении и в драйвере можно записывать в 16-ричном виде, а можно использовать макрос CTL_CODE, как это сделано в примере лаб. работы в файле common.inc.

Рассмотрим пример кода действия из драйвера виртуального устройства, который используется в лабораторной работе. Имя - IOCTL_GET.

В случае виртуального устройства файловый флаг равен 0.

Тип устройства - FILE_DEVICE_UNKNOWN = 22h

Права доступа - FILE_READ_ACCESS+FILE_WRITE_ACCESS = 1+2=3=11b

Функциональный код - в диапазоне от 800h до FFFh. У нас - 800h.

Метод буферизации - способ передачи данных между приложением и драйвером (возможны три):

Для небольшого объема данных используется обычно METHOD_BUFFERED (00b) - выделяется дополнительный буфер в нестраничной памяти, достаточный для размещения входного и выходного буфера. Адрес этого буфера размещается в IRP в поле AssociatedIrp.SystemBuffer. Диспетчер в/выв сам берет на себя работу перезаписи данных между пользовательским и дополнительным буфером.

Прямой доступ к данным (без буфера) - METHOD_OUT_DIRECT (2) - для вывода либо METOD_IN_DIRECT (1) - для ввода; поле из IRP - MdlAddress. Это непосредственное обращение - диспетчер в/выв фиксирует в памяти физические страницы, содержащие буфер пользовательского режима. При этом создает вспомогательную структуру MDL (Memory Descriptor List) для описания зафиксированных страниц. И разработчик драйвера работает с MDL.

Доступ через буфер пользовательского уровня - METHOD_NEITHER (3); поле из IRP - SystemBuffer. Диспетчер в/выв передает в драйвер виртуальные адреса пользовательского режима. И в драйвере нужно очень осторожно с ними работать, потому что драйвер в этом случае должен работать только в контексте вызывающего потока.

Когда приложение посылает драйверу код действия, то начинает работу диспетчер ввода-вывода. Он отвечает за формирование пакета запроса ввода-вывода (I/O request packet, IRP) и посылку его драйверу для дальнейшей обработки.

Мы будем рассматривать 3 типа запросов:

IRP_MJ_CREATE - будет передан при CreateFile,

IRP_MJ_DEVICE_CONTROL - будет передан при DeviceIoControl

IPR_MJ_CLOSE - при CloseHandle

Пакет IRP состоит из заголовка и стеков размещения в/выв. Диспетчер в/выв создает количество ячеек стека в/выв равное числу драйверных слоев, участвующих в обработке запроса. Каждому драйверу разрешен доступ к собственной ячейке стека. Когда драйвер передает пакет IRP драйверу нижнего уровня, указатель на ячейку стека перемещается на ячейку, необходимую этому драйвера. И, наоборот, после обработки запроса, указатель поднимается вверх на ячейку драйвера высшего уровня. Получение указателя с помощью функции - IoGetCurrentStackLocation().

В каждом стеке размещения находится указатель на объект-устройство DeviceObject и на объект-файл FileObject, для которого инициирован запрос. Пакеты IRP всегда хранятся в невыгружаемой памяти.

Для работы драйвера создаются и применяются следующие объекты:

Объект драйвера;

Объекты устройств;

Этапы работы драйвера.

1) Создание объекта драйвера. Создается при загрузке драйвера на этапе его запуска. В этот момент запускается функция DriverEntry и заполняется массив MajorFunction, а также указатель на объект устройства и обратно.

В состав объекта устройства входят:

Тип устройства.

2) Создание символьной ссылки на устройство. Для того чтобы объект "устройство" стал доступен коду режима пользователя, драйвер должен создать в доступном ему (коду режима пользователя) каталоге "\??" еще один объект - символьную ссылку (symbolic link). Драйвер shablon.sys создает символьную ссылку "slshablon" на свое устройство "devshablon" в каталоге "\??", значением которой является строка "\Device\devshablon".

Таким образом, уже при загрузке драйвера (в нашем случае, на этапе загрузки ОС) мы имеем три объекта в памяти: драйвер "\Driver\shablon", устройство "\Device\shablon" и символьную ссылку на устройство "\??\slshablon".

3) Открытие. Дальше при запуске приложения вызывается CreateFile. Там есть ссылка на устройство. Из структуры объекта устройства DEVICE_OBJECT извлекаются сведения об обслуживающем его драйвере. Диспетчер ввода-вывода формирует пакет запроса ввода-вывода IRP типа IRP_MJ_CREATE и направляет его драйверу. Так драйвер узнает о том, что код режима пользователя пытается получить доступ к его устройству. Если драйвер не имеет ничего против, то он возвращает код успеха. У нашего драйвера есть специальная процедура диспетчеризации, которая реагирует на это IRP - DispatchCreateClose (там совмещенная процедура для открытия и закрытия устройства). В ней в поле Io.Status.Status передается STATUS_SUCCESS, а в Io.Status.Information - 0, т.к. в этом случае ничего не нужно передавать. Такой ответ от драйвера является сигналом диспетчеру объектов о создании виртуального файла. При этом в таблице описателей (handle table) процесса создается новый элемент с указателем на объект "файл", и коду режима пользователя возвращается новый дескриптор.

Если все ОК, то мы сохраняем дескриптор файла, возвращенный CreateFile, в переменной hDevice.

4) Операции в/выв. Теперь мы имеем возможность осуществлять операции управления этим устройством посредством вызова функций DeviceIoControl. Поскольку драйвер устройства может в принципе выполнять много различных задач, необходимо как-то дифференцировать запросы. Для этого и предназначен второй параметр dwIoControlCode, называемый управляющим кодом ввода-вывода (I/O control code), который строится по определенным правилам.

Используя описатель устройства, диспетчер ввода-вывода извлечет сведения об обслуживающем его драйвере, сформирует пакет запроса ввода-вывода типа IRP_MJ_DEVICE_CONTROL и направит его драйверу. В драйвере будет вызвана соответствующая процедура DispatchControl, которой в качестве параметров передаются код действия и сведения об адресах и размерах входного и выходного буфера. Все это передается через IRP. В процедуре из IRP берется необходимая информация: код действия, адрес буфера для передачи данных.

Процедура DispatchControl выполняет необходимые действия, в нашем случае адрес пакета IRP из регистра ESI Затем передает результат через выходной буфер в приложение.

Аналогично предыдущей процедуре, передаем через IRP статус завершения и количество переданных из драйвера байтов.

В приложении эти данные форматируются и выводятся.

5) Закрытие. Как и полагается поступать с дескрипторами, которые больше не нужны, вызовом функции CloseHandle, закрываем описатель устройства.

6) Выгрузка драйвера. Удаляем символьную ссылку и удаляем объект устройства.

Комплекс (2) состоит из двух программ:

Приложение, которое обращается к драйверу за адресом IRP, а затем этот адрес выводит в стандартное окно Windows.

Shablon.sys - драйвер.

Драйвер shablon выполняет то, что нельзя сделать на уровне пользователя, в данном случае определяет содержимое регистра esi при работе драйвера.

Приложение в выходном буфере получает содержимое esi, преобразует его для вывода в шестнадцатеричном виде и выводит в стандартное окно Windows.

Если необходимо в драйвере получить информацию из CMOS, то требуется:

Послать в порт 70h смещение в CMOS, которое нас интересует;

Небольшая задержка;

Взять из порта 71h информацию в al.

Затем записать эту информацию в выходной буфер.

А в приложении необходимо взять информацию из выходного буфера, при необходимости, преобразовать ее и вывести, либо проанализировать и в зависимости от результата вывести в стандартное окно необходимый текст.

В этой лабораторной работе предполагается, что драйвер устанавливается постоянно в Windows с помощью.inf-файла, используя из Панели управления пункт - Установка оборудования: Добавление нового устройства, Установка вручную, Показать все устройства, Установить с диска, с помощью обзора выбрать файл.inf (драйвер должен быть в той же папке).

Чтобы проверить, что драйвер установлен, выбираем в панели управления Система, Оборудование, Диспетчер устройств.

1.3 Доступ к существующим драйверам из приложений пользовательского режима

Алгоритм работы приложения работающего с драйвером

Для работы с драйвером приложению пользовательского режима необходимо получить манипулятор(хэндл) драйвера. Этот манипулятор можно получить, используя API-функцию CreateFile или CreateFileA, которая работает с ASCII-символами. Далее используется API-функция DeviceIoControl, которой, в качестве одного из параметров, передается IOCTL-код. IOCTL-код это управляющий код, с помощью которого драйвер узнает об операции, выполнение которой запрашивает приложение, методе передачи параметров и правах доступа, которые необходимы приложению для выполнения этой операции. После того как приложение вызвало

DeviceIoControl драйверу отправляется IRP_MJ_DEVICE_CONTROL. После завершения обработки запросы приложению возвращается управление и приложению остается проанализировать ответ драйвера и закрыть открытые дескрипторы.

Пример

В приведенном ниже примере приложение пользовательского режима отправляет запрос IOCTL_DISK_GET_PARTITION_INFO_EX драйверу файловой системы, проводит анализ полученной информации и выводит формат раздела жесткого диска.

#include

#include

int _tmain(int argc, _TCHAR* argv)

DWORD dwBytesReturned = 0;

char cPartitionStyle = {0};

PARTITION_INFORMATION_EX piPartitionInfo;

HANDLE hDevice = CreateFileA(

/*1*/"\\\\.\\c:",

/*2*/GENERIC_READ | GENERIC_WRITE,

/*3*/FILE_SHARE_READ | FILE_SHARE_WRITE,

/*5*/OPEN_EXISTING,

if (hDevice == INVALID_HANDLE_VALUE)

MessageBoxA(NULL, "CreateFileA error!", "Error", 0);

if (DeviceIoControl(

/*1*/(HANDLE) hDevice,

/*5*/&piPartitionInfo,

/*6*/sizeof(piPartitionInfo),

/*7*/&dwBytesReturned,

if(piPartitionInfo.PartitionStyle == PARTITION_STYLE_MBR)

MessageBoxA(NULL, "PARTITION_STYLE_MBR", "Caption", 0);

else if(piPartitionInfo.PartitionStyle == PARTITION_STYLE_GPT)

MessageBoxA(NULL, "PARTITION_STYLE_GPT", "Caption", 0);

MessageBoxA(NULL, "PARTITION_STYLE_RAW", "Caption", 0);

MessageBoxA(NULL, "DeviceIoControl error", "Error", 0);

CloseHandle(hDevice);

Разбор примера

Объявляются переменные, необходимые для работы приложения. PARTITION_INFORMATION_EX это структура, которая описывает информацию о разделе жесткого диска.

typedef struct {

} PARTITION_INFORMATION_EX;

В этой части программы вызывается функция CreateFileA для получения манипулятора, который записывается в переменную hDevice.

Синхронно вызывается функция DeviceIoControl. Ей передаются:

дескриптор устройства;

IOCTL-код IOCTL_DISK_GET_PARTITION_INFO_EX;

указатель на входной буфер, NULL в нашем случае;

размер входного буфера;

указатель на выходной буфер;

размер выходного буфера;

указатель на переменную типа DWORD, в которой будет храниться количество возвращаемых байтов;

указатель на структуру OVERLAPPED, которая используется для асинхронного вызова функции.

После возврата управления, в случае успешного завершения функции, в структуре PARTITION_INFORMATION_EX хранится информация о разделе.

Производится анализ и вывод информации. Перед возвращением управления операционной системе можно закрыть открытые дескрипторы. Это позволяет сделать функция CloseHandle(__in HANDLE). Если дескрипторы не закрыть, то это сделает операционная система за Вас.

2. Выполнение курсовой работы

2.1 Шаг 1

Задание: 1. Разработать драйвер ядра с доступом к портам, выполняющий действия согласно варианту и осуществляющий вывод информации в окно Debug View (по варианту), а также приложение, запускающее драйвер.

Листинг Kurs_test.cpp

#include "stdafx.h"

#include "windows.h"

#include "stdlib.h"

SC_HANDLE hSCManager;

SC_HANDLE hService;

char acDriverPath;

if (hSCManager!=0){

// регистрация проигрывателя в таблице диспетчера SCManager

if (hService!=0){

// Удаляем запись о драйвере

DeleteService(hService);

CloseServiceHandle(hService);

return 0;

}

Листинг beeper.sys

#include

#define TIMER_FREQUENCY 1193167 // 1,193,167 Hz

#define PITCH_C 523 // 523,25 Hz

#define PITCH_Cs 554 // 554,37 Hz

#define PITCH_D 587 // 587,33 Hz

#define PITCH_Ds 622 // 622,25 Hz

#define PITCH_E 659 // 659,25 Hz

#define PITCH_F 698 // 698,46 Hz

#define PITCH_Fs 740 // 739,99 Hz

#define PITCH_G 784 // 783,99 Hz

#define PITCH_Gs 831 // 830,61 Hz

#define PITCH_A 880 // 880,00 Hz

#define PITCH_As 988 // 987,77 Hz

void DO_DELAY(int time){

long i,j;

for (i=0; i<=time*0xfffff; i++) {}

}

void DO_BIG_DELAY(int time){

DO_DELAY(2*time);

}

void Xylophone(int nPitch){

int nTone = TIMER_FREQUENCY/nPitch

_asm {

mov al, 10110110b;//запись управляющего слова в 43h

out 43h, al;//Канал управления звуком - логическая схема, использующая тональный сигнал таймера и программно-управляемые биты системного порта

mov eax, nTone;//запись пересчитанной частоты в 42

out 42h, al;//старшая часть

mov al, ah;//младшая часть

out 42h, al

in al, 61h;//изменение управляющей последовательности - преобразование последних битов в единицы

;//бит 0 - разрешение использования спикера

;//бит 1 - разрешение подключения таймер-2 к спикеру

or al, 00000011b; speaker ON

out 61h, al

}

DO_DELAY(0x7f);

_asm {

in al, 61h

and al, 11111100b; speaker OFF

out 61h, al

}

}

Xylophone(PITCH_C);

Xylophone(PITCH_С);

Xylophone(PITCH_С);

Xylophone(PITCH_С);

Xylophone(PITCH_С);

Xylophone(PITCH_С);

Xylophone(PITCH_С);

return STATUS_DEVICE_CONFIGURATION_ERROR;

}

2.2 Шаг 2

Разработать драйвер виртуального устройства, позволяющий выполнять действия, доступные только на нулевом уровне привилегий (в соответствии с вариантом), а затем передавать результаты в приложение на 3 уровень привилегий для вывода их на экран.

В приложении выводим результат в стандартное окно Windows.

Листинг shablon.c

#include // various NT definitions

#include

UNICODE_STRING g_usDeviceName;

UNICODE_STRING g_usSymbolicLinkName;

void DriverUnload(IN PDRIVER_OBJECT pDriverObject){

IoDeleteSymbolicLink(&g_usSymbolicLinkName);

IoDeleteDevice(pDriverObject->DeviceObject);

}

NTSTATUS DispatchCreateClose(PDEVICE_OBJECT pDeviceObject, PIRP pIrp){//обработка MJ_CREATE MJ_CLOSE

pIrp->IoStatus.Status = STATUS_SUCCESS;

pIrp->IoStatus.Information = 0;

IoCompleteRequest(pIrp,IO_NO_INCREMENT);

return STATUS_SUCCESS;

}

NTSTATUS DispatchControl(PDEVICE_OBJECT pDeviceObject, PIRP pIrp){//обработка IRP_MJ_DEVICECONTROL

NTSTATUS status;

int regEsi;

// берем указатель на IO_STACK_LOCATION, в нем на IoControlCode

if (pIrp->Tail.Overlay.CurrentStackLocation->Parameters.DeviceIoControl.IoControlCode ==IOCTL_GET){

//Сравниваем код действия и если это таки наш клиент, то:

_asm{

mov eax,0

mov al,10h

out 70h,al

in al,71h

cbw

cwde

mov regEsi,eax

}

// это наша функциональность - берем содержимое регистра esi

// записываем его в системный буфер

*((int*)pIrp->AssociatedIrp.SystemBuffer) = regEsi;

pIrp->IoStatus.Information = 4; // и задаем размер результат

status = STATUS_SUCCESS;

} else status = STATUS_INVALID_DEVICE_REQUEST;

pIrp->IoStatus.Status = status;

IoCompleteRequest(pIrp, IO_NO_INCREMENT);

return(status);

}

int DriverEntry(IN PDRIVER_OBJECT pDriverObject, IN PUNICODE_STRING pusRegistryPath){

NTSTATUS Status;

PDEVICE_OBJECT pDeviceObject;

// инициализируем Unicode-строки

RtlInitUnicodeString(&g_usDeviceName, L"\\Device\\DevGet");

RtlInitUnicodeString(&g_usSymbolicLinkName, L"\\??\\sldevGet");

// заполняем объект драйвера - доходчиво объясняем драйвера какая функция что обрабатывает

pDriverObject->DriverUnload = &DriverUnload;

pDriverObject->MajorFunction = &DispatchCreateClose;

pDriverObject->MajorFunction = &DispatchCreateClose;

pDriverObject->MajorFunction = &DispatchControl;

// создаем логический объект виртуального устройства

Status = IoCreateDevice(pDriverObject, 0, &g_usDeviceName, FILE_DEVICE_UNKNOWN, 0, FALSE, &pDeviceObject);

if(!NT_SUCCESS(Status)){return Status;}

//создаем символьную ссылку на устройство

Status = IoCreateSymbolicLink(&g_usSymbolicLinkName, &g_usDeviceName);

if(!NT_SUCCESS(Status)){

IoDeleteDevice(pDeviceObject);

return Status;

}

return Status;

}

Листинг курсовая2.cpp

#include "stdafx.h"

#include "windows.h"

#include "stdlib.h"

#define IOCTL_GET CTL_CODE(FILE_DEVICE_UNKNOWN, 0x800, METHOD_BUFFERED, FILE_READ_ACCESS + FILE_WRITE_ACCESS)

int _tmain(int argc, _TCHAR* argv){

HANDLE hDevice;

BOOL DevControl;

DWORD dwBytesReturned;

char stroka;

/*

Параметры:

lpFileName Адрес нульзаканчивающейся строки, которая определяет имя объекта для его создания или открытия.

dwDesiredAccess Тип досупа к объекту. Данный параметр может принимать любую комбинацию из следующих значений:

Значение: Описание:

0 Определяет запрос о доступности объекта на указанном устройстве. Приложение может запросить атрибуты устройства, без доступа к нему.

GENERIC_READ Определяет доступ на чтение из объекта. Данные могут быть прочитаны из файла и файловый указатель может быть перемещен. Комбинируйте с GENERIC_WRITE для доступа к чтению-записи.

GENERIC_WRITE Определяет доступ на запись в объект. Данные могут быть записаны в файл и файловый указатель может быть перемещен. Комбинируйте с GENERIC_READ для доступа к чтению-записи.

dwShareMode Режим разделяемого доступа к объекту. При нулевом значеним объект не может быть использован совместно несколькими программами. Все последующие операции открытия объекта будут терпеть неудачу, пока дескриптор объекта не будет закрыт. Для совместного использования объекта используйте комбинацию следующих значений:

Значение: Описание:

FILE_SHARE_DELETE Допускает последовательность операций открытия объекта для запроса доступа на удаление.

FILE_SHARE_READ Допускает последовательность операций открытия объекта для запроса доступа на чтение.

FILE_SHARE_WRITE Допускает последовательность операций открытия объекта для запроса доступа на запись

lpSecurityAttributes Адрес структуры SECURITY_ATTRIBUTES, которая определяет может или нет возвращаемый функцией дескриптор быть унаследован дочерним процессом.

Если lpSecurityAttributes равен NULL, то дескриптор не может быть унаследован.

dwCreationDisposition

Значение: Описание:

CREATE_ALWAYS Создает новый файл, всегда.

Если файл существует, функция перезаписывает файл.

CREATE_NEW Создает новый файл. Функция завершится с ошибкой если файл существует.

OPEN_ALWAYS Открыть файл, всегда. Если файл не существует, функция создает его так же, если dwCreationDisposition был бы CREATE_NEW.

OPEN_EXISTING Открывает файл. Функция завершится с ошибкой если файл не существует.

TRUNCATE_EXISTING Открывает файл и обрезает его до нулевого размера. Функция завершится с ошибкой если файл не существует.

dwFlagsAndAttributes Флаги и атрибуты файла.

Когда открывается существующий файл, то CreateFile игнорирует файл-шаблон.

Возвращаемые значения:

Если функция успешна, возвращается открытый дескриптор указанного файла. Если указанный файл существует до вызова функции и параметр dwCreationDisposition равен CREATE_ALWAYS или OPEN_ALWAYS, вызов GetLastError вернет ERROR_ALREADY_EXISTS, даже если функция успешна. Если файл не существует перед вызовом, GetLastError вернет 0 (ноль).

При ошибке, функция вернет INVALID_HANDLE_VALUE. Для получения дополнительной информации об ошибке, вызывайте GetLastError.

*/

if (hDevice != 0){

/*

hDevice - это хэндл, возвpащенный CreateFile"ом.

dwIocontrolCode - это значение, котоpое указывает опеpацию, котоpую должен выполнить.

lpInBuffer - это адpес буфеpа, котоpый содеpжит данные, необходимые для выполнения опеpации, указанные в dwIoControlCode. Если опеpация не тpебует данных, вы можете пеpедать NULL.

nInBufferSize - это pазмеp в байтах данных в буфеpе, на котоpый указывает lpInBuffer.

lpOutBuffer - это адpес буфеpа, котоpый заполнится выходными данными, когда опеpация будет успешно пpоизведена. Если опеpация не пpедполагает выходных данных, это поле должно pавняться NULL"у.

nOutBufferSiz - это pазмеp в байтах буфеpа, на котоpый указывает lpOutbuffer.

lpBytesReturned - адpес пеpеменной типа dword, котоpая получит pазмеp данных, вписанных в lpOutBuffer.

lpOverlapped - это адpес стpуктуpы OVERLAPPED, если вы хотите, чтобы опеpация была асинхpонной. Если вы хотите подождать, пока опеpация будет выполнена, поместите NULL в это поле.

*/

wsprintf((LPSTR) stroka, "%X", adwOutBuffer);//запись строки в буфер (adwOutBuffer --> stroka)

CloseHandle(hDevice);

return 0;

}

драйвер ядро компьютерный программа

2.3 Шаг 3

Листинг курсовая.cpp

#include

#include

#include

{

DWORD junk;

0, // атрибуты файла

return (FALSE);

}

0, // размер входного буфера

CloseHandle(hDevice);

return (bResult);

}

int main(int argc, char *argv)

{

/*

typedef struct {

PARTITION_STYLE PartitionStyle; // формат раздела

LARGE_INTEGER StartingOffset; // смещение начала раздела

LARGE_INTEGER PartitionLength; // размер раздела

DWORD PartitionNumber; // номер раздела

BOOLEAN RewritePartition; // если раздел перезаписываемый то TRUE

union {

PARTITION_INFORMATION_MBR Mbr; // дополнительная информация MBR Style раздела

PARTITION_INFORMATION_GPT Gpt; // дополнительная информация GPT Style раздела

};

} PARTITION_INFORMATION_EX;

*/

BOOL bResult;

system("PAUSE");

return ((int)bResult);

}

2.4 Шаг 4

1) Объединить всю функциональность, разработанную на шагах 1-3, в один комплекс программ.

Заключительный комплекс должен выглядеть следующим образом:

- Наш драйвер встраивается в систему и загружается на этапе загрузки Windows.

- Приложение запрашивает у драйвера необходимую (заданную на этапе 2) информацию, драйвер передает эту информацию, при этом также включается динамик на некоторое время и проигрывается мелодия (заданная на этапе 1). Затем в приложении производится запрос к существующему в системе драйверу (в соответствии с вариантом к этапу 3).

2) Оформить пояснительную записку, в которой должны быть описаны все 4 этапа, а также - теоретические сведения для каждого этапа.

#include "stdafx.h"

#include "windows.h"

#include "stdlib.h"

#define IOCTL_GET CTL_CODE(FILE_DEVICE_UNKNOWN, 0x800, METHOD_BUFFERED, FILE_READ_ACCESS + FILE_WRITE_ACCESS)

BOOL GetPartitionNumber(PARTITION_INFORMATION_EX *pex)

{

HANDLE hDevice; // дескриптор проверяемого устройства

BOOL bResult; // флажок результата

DWORD junk;

hDevice = CreateFile(TEXT("\\\\.\\c:"), // открываемое устройство

GENERIC_READ | GENERIC_WRITE, // доступ к устройству

FILE_SHARE_READ |FILE_SHARE_WRITE, // режим совместного использования

NULL, // атрибуты безопасности по умолчанию

OPEN_EXISTING, // расположение

0, // атрибуты файла

NULL); // не копировать атрибуты файла

if (hDevice == INVALID_HANDLE_VALUE){ // невозможно открыть устройство

printf("CreateFile() failed!\n");

return (FALSE);

}

bResult = DeviceIoControl(hDevice, // запрошенное устройство

IOCTL_DISK_GET_PARTITION_INFO_EX, // выполняемая операция

NULL, // указатель на входной буфер

0, // размер входного буфера

pex, sizeof(*pex), // выходной буфер

&junk, // количество возвращаемых байтов

(LPOVERLAPPED) NULL); // синхронизация ввода/вывода (I/O)

CloseHandle(hDevice);

return (bResult);

}

int _tmain(int argc, _TCHAR* argv){

SC_HANDLE hSCManager;

SC_HANDLE hService;

char acDriverPath;

HANDLE hDevice;

BOOL DevControl;

DWORD dwBytesReturned;

LPVOID adwInBuffer, adwOutBuffer;

char stroka;

PARTITION_INFORMATION_EX pex; // структура устройства

BOOL bResult;

hDevice = CreateFile("\\\\.\\sldevGet",GENERIC_READ+GENERIC_WRITE,0, NULL,OPEN_EXISTING, 0, NULL);

if (hDevice != 0){

DevControl = DeviceIoControl(hDevice,IOCTL_GET,&adwInBuffer, sizeof(adwInBuffer),&adwOutBuffer,sizeof(adwOutBuffer), &dwBytesReturned,NULL);

if ((DevControl != 0)&&(dwBytesReturned != 0)){

wsprintf((LPSTR) stroka, "%X", adwOutBuffer);//запись строки в буфер (adwOutBuffer --> stroka)

if (stroka =="00000100") MessageBox(NULL,"Found 1.44 Mb","Yermakov FDD scaner",MB_OK);

else MessageBox(NULL,"Not found","Yermakov FDD scaner",MB_OK);

hSCManager = OpenSCManager(NULL, NULL, SC_MANAGER_CREATE_SERVICE);

if (hSCManager!=0){

GetFullPathName("beeper.sys",sizeof acDriverPath,acDriverPath,NULL);

// Регистрация музыканта в таблицах SCM

hService=CreateService(hSCManager,"beeper11","Nice Melody Beeper11",

SERVICE_START+DELETE,SERVICE_KERNEL_DRIVER,SERVICE_DEMAND_START,

SERVICE_ERROR_IGNORE,acDriverPath,NULL,NULL,NULL,NULL,NULL);

if (hService!=0){

StartService(hService, 0, NULL);

DeleteService(hService);

CloseServiceHandle(hService);

}else MessageBox(NULL,"Can"t register driver",NULL,MB_ICONSTOP);

CloseServiceHandle(hSCManager);

}else MessageBox(NULL,"Can"t connect to SCManager",NULL, MB_ICONSTOP);

}else MessageBox(NULL,"Can"t send control code",NULL,MB_OK);

CloseHandle(hDevice);

}else MessageBox(NULL, "Dev is not present", NULL, MB_ICONSTOP);

bResult = GetPartitionNumber (&pex);

if (bResult){ printf("PartitionNumber = %d\n", pex.PartitionNumber);

}else{ printf ("GetPartitionNumber() failed. Error %d.\n", GetLastError());}

system("PAUSE");

return ((int)bResult);

}

3. Работа приложения

Рисунок 3.1. Драйвер из шага 2

Рисунок 3.2. Драйвер из шага 3

Размещено на Allbest.ru

Подобные документы

    Механизмы взаимодействия драйвера режима ядра и пользовательского приложения: многослойная драйверная архитектура, алгоритм сокрытия данных, взаимодействие драйвера и приложения, пользовательский интерфейс программы фильтрации доступа к файлам.

    курсовая работа , добавлен 23.06.2009

    Архитектура ввода/вывода Windows NT. Внутренняя организация шины USB. Сущностная характеристика драйверной модели WDM. Точки входа разрабатываемого драйвера, размещение кода в памяти, установка драйвера в системе. Реализация кода драйвера на языке C.

    курсовая работа , добавлен 27.09.2014

    Структура режима пользователя, предоставляющего возможность пользователю вступать во взаимодействие с системой. Описание режима ядра, который обеспечивает безопасное выполнение приложений (программ) пользователя. Уровень аппаратных абстракций Windows NT.

    презентация , добавлен 23.10.2013

    Ядро Windows 98. Роль 16-разрядных модулей ядра. Проблемы быстродействия. Кооперативная и вытесняющая многозадачность. Улучшенное использование ресурсов в Windows 98. Использование WordArt. Программа MS Outlook Express: создание и отправка сообщений.

    контрольная работа , добавлен 14.04.2005

    Совместное функционирование всех устройств компьютера и доступ к его ресурсам. Понятие и функции графической операционной системы Windows. Справочная служба Windows. Управление файловой системой. Технология "Plug and Play". Графический интерфейс Windows.

    контрольная работа , добавлен 22.01.2011

    Характеристика операционной системы. История развития Windows. Сравнительная характеристика версий Windows. Элементы и инструменты Windows XP. Прикладные программы в Windows XP. Работа настольных и портативных компьютеров под управлением Windows.

    доклад , добавлен 16.10.2011

    Использование драйвера режима ядра и управляющего приложения для создания системных потоков. Имитация обработки данных и организация задержек. Разработка драйвера на языке C++. Конфигурация тестового стенда. Точность изменения задержек и работы таймера.

    курсовая работа , добавлен 24.06.2009

    Дослідження внутрішньої структури операційної системи Windows. Архітектура NT і структура ядра. Методи перехоплення функцій у режимі ядра та режимі користувача. Поняття драйверу. Пакети вводу-виводу. Оцінка стабільності та безпеки системи Windows.

    курсовая работа , добавлен 02.01.2014

    Понятие, типы и работа брандмауэра. Встроенные в Windows firewall. Windows XP SP2, доступ к настройкам файрвола Windows XP Service Pack 2. Windows Vista, разрешенный трафик. Windows 7, настройки активных профилей. Персоальные Firewall, уровни тестов.

    реферат , добавлен 19.11.2010

    Знакомство с техническими характеристиками персонального компьютера. Установка операционной системы и драйверов Windows 7. Способы чистки Windows XP Professional SP3. Методы восстановления операционной системы. Выполнение установки Microsoft Office 2010.

В моем основном ноутбуке различные проблемы с электропитанием возникают часто, что объяснимо работой в инсайдерских сборках. Однако и в стабильной версии 1803 я заметил, что моя система перестала уходить в сон. При этом монитор выключался через указанный промежуток времени, что намекало на правильное определение системой состояния бездействия .

Я выставил маленький период перехода в сон, 1-2 минуты и приступил к диагностике.

Проверка запросов к подсистеме питания от приложений и драйверов

Первым делом надо смотреть в powercfg , что удерживает ОС от перехода в сон. Процессы и драйверы, обращающиеся к подсистеме электропитания, можно увидеть в командной строке от имени администратора :

Powercfg -requests

Сразу видно, что запрос к SYSTEM идет от DRIVER — в данном случае, Realtek использует аудиопоток.

В списке также может присутствовать WebRTC от Chrome, а сразу после перезапуска системы там можно увидеть запросы оптимизации загрузки, индекс поиска, но они быстро исчезают. Можно внести процесс или драйвер в список исключений, и он не будет препятствовать уходу в сон.

Powercfg -requestsoverride DRIVER "Realtek High Definition Audio (HDAUDIO\FUNC_01&VEN_10EC&DEV_0269&SUBSYS_17AA2204&REV_1002\4&d00657&0&0001)" SYSTEM

Команда читается как «игнорировать запрос от DRIVER [полное имя драйвера] к SYSTEM».

Список исключений хранится в разделе реестра

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Power\PowerRequestOverride

и выводится командой

Powercfg -requestsoverride

Я перезагрузился для верности, но система отказывалась засыпать. Проверив исключения и список запросов, я обнаружил, что драйвер Realtek продолжал использовать аудиопоток, хотя был внесен в исключения.

Я поплясал немножко с бубном вокруг исключений, но успеха не добился. Быстрое гугление подтвердило, что в некоторых случаях они не срабатывают. Это типично для legacy запросов, но тут был другой случай, и я не первый, кто с этим столкнулся.

В итоге я удалил Realtek из списка. Можно удалять записи в редакторе реестра или консоли. Команда почти такая же, как при добавлении, просто не указывается куда идет запрос, т.е. в данном случае в конце команды нет SYSTEM:

Powercfg -requestsoverride DRIVER "Realtek High Definition Audio (HDAUDIO\FUNC_01&VEN_10EC&DEV_0269&SUBSYS_17AA2204&REV_1002\4&d00657&0&0001)"

Мы пойдем другим путем

Вычисление процесса, использующего подсистему звука

Известно, что черными делами занимается драйвер Realtek. Очевидно, он загружается при старте системы, поэтому имя файла несложно выяснить с помощью Autoruns .

Три записи относятся к двум файлам, один из которых – панель управления, судя по имени. Поэтому объектом интереса стал ravbg64.exe .

Центр безопасности Защитника Windows , в том числе новый раздел “Безопасность устройства”, которые предлагает управление расширенными инструментами безопасности, такими как «Изоляция ядра».

Изоляция ядра - технология безопасности на основе виртуализации, которая обеспечивает дополнительный уровень защиты против интеллектуальных атак. Целостность памяти является одной из составных частей технологии изоляции ядра - функция предназначена для предотвращения вставки вредоносного кода в процессы с высокой безопасностью. Защита обеспечивается за счет того, что страница виртуальной памяти ядра начинает выполнятся только после успешного прохождения проверки целостности.

Рассмотрим, как включить функцию “Целостность памяти” в Windows 10 April 2018 Update, чтобы усилить безопасность компьютера.

Включение целостности памяти

  • Откройте Центр безопасности Защитника Windows.
  • Выберите раздел “Безопасность устройства”.
  • В секции “Изоляции ядра” нажмите ссылку “Сведения об изоляции ядра”.
  • Переведите переключатель “Целостность памяти” в активное положение.

После выполнения этих действий нужно перезагрузить компьютер, чтобы изменения вступили в силу.

Примечание : для работы данной функции ваш процессор должен поддерживать технологии виртуализации. Кроме того, виртуализация должна быть включена в BIOS или UEFI. В противном случае, функция будет недоступна.

Исправление проблем с изоляцией ядра

В некоторых случаях можно столкнуться с проблемами совместимости в некоторых приложениях, если изоляция ядра включена. Чтобы исправить неполадки придется отключить функцию.

Если вы пытаетесь отключить целостность памяти в Центре безопасности Защитника Windows, но опция стала неактивной и показывается сообщение “Этим параметром управляет ваш администратор”, то все еще можно деактивировать функцию с помощью системного реестра.

Примечание : Некорректное изменение реестра может привести к серьезным проблемам. Рекомендуется создать резервную копию реестра Windows перед тем, как выполнить данные шаги. В меню редактора реестра выберите Файл > Экспорт для сохранения резервной копии.

  • Нажмите сочетание клавиш Windows + R , чтобы вызвать окно “Выполнить”.
  • Введите regedit и нажмите ОК, чтобы запустить редактор реестра.
  • Перейдите по следующему пути:
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\DeviceGuard\Scenarios\HypervisorEnforcedCodeIntegrity
  • Дважды щелкните по записи Enabled .
  • Поменяйте значение с 1 на 0.
  • Нажмите ОК.

Для отключения вы также можете воспользоваться готовым

Драйверы режима ядра: Часть 1: Основные понятия — Архив WASM.RU

Обзор архитектуры

Внутренний мир Windows 2000 разделен на две части с четко обозначенными границами, как в плане адресного пространства, так и в плане прав и обязанностей кода в этом адресном пространстве выполняющегося.

С разделением адресного пространства все на удивление просто. Все четыре, доступного в 32-х разрядной архитектуре, гигабайта разделены на две равные части (4GT RAM Tuning и Physical Address Extension я опускаю как зкзотические). Нижняя половина отдана процессам пользовательского режима, верхняя принадлежит ядру.

С разделением прав и обязанностей немного сложнее.

К пользовательским относятся следующие процессы:

  • Процессы поддержки системы (System Support Processes) - например, процесс входа в систему Winlogon (реализован в \%SystemRoot%\System32\Winlogon.exe);
  • Процессы сервисов (Service Processes) - например, спулер печати;
  • Пользовательские приложения (User Applications) - бывают пяти типов: Win32, Windows 3.1, MS-DOS, POSIX и OS/2;
  • Подсистемы окружения (Environment Subsystems) - поддерживается три подсистемы окружения: Win32 (реализована в \%SystemRoot%\System32\Csrss.exe), POSIX (реализована в \%SystemRoot%\System32\Psxss.exe), OS/2 (реализована в \%SystemRoot%\System32\os2ss.exe).

Ядро состоит из следующих компонентов:

    Исполнительная система (Executive) - управление памятью, процессами и потоками и др.;
  • Ядро (Kernel) - планирование потоков, диспетчеризация прерываний и исключений и др. (реализовано в \%SystemRoot%\System32\Ntoskrnl.exe);
  • Драйверы устройств (Device Drivers) - драйверы аппаратных устройств, сетевые драйверы, драйверы файловых систем;
  • Уровень абстрагирования от оборудования (Hardware Abstraction Layer, HAL) - изолирует три вышеперечисленных компонента от различий между аппаратными архитектурами (реализован в \%SystemRoot%\System32\Hal.dll);
  • Подсистема поддержки окон и графики (Windowing And Graphics System) - функции графического пользовательского интерфейса (Graphic User Interface, GUI) (реализована в \%SystemRoot%\System32\Win32k.sys).

Рис. 1-1. Упрощенная схема архитектуры Windows 2000

Режим пользователя и режим ядра

Хотя процессоры семейства Intel x86 поддерживают четыре уровня привилегий (называемых кольцами защиты), в Windows используются только два: 0-ой для режима ядра и 3-ий для режима пользователя. Это связано с поддержкой других процессоров (alpha, mips), в которых реализовано только два уровня привилегий. Предыдущие выпуски Windows NT поддерживали эти архитектуры, но в Windows 2000 осталась поддержка только x86.

Компоненты пользовательского режима имеют свои защищенные адресные пространства, потоки этих процессов выполняются в непривилегированном режиме процессора (называемом пользовательским), не могут выполнять привилегированные команды процессора, имеют ограниченный и опосредованный доступ к системным данным, и к системному адресному пространству, не имеют прямого доступа к оборудованию. Правда, в процессе своей работы, потоки этих процессов, вызывая системные сервисы, переходят в режим ядра, но в этом случае полностью теряют контроль над своим выполнением до возвращения обратно в режим пользователя.

Процессы пользовательского режима рассматриваются как потенциально опасные с точки зрения стабильности системы. Их права ограничиваются. И всяческие попытки выйти за пределы этих ограничений жестко пресекаются.

Компоненты ядра разделяют единое адресное пространство, выполняются в привилегированном режиме процессора (называемом режимом ядра), могут выполнять все, в том числе и привилегированные, команды процессора, имеют неограниченный и прямой доступ к системным данным и коду, имеют прямой, или через HAL, доступ к оборудованию.

Код ядра (собственно это и есть сама система) рассматривается как полностью доверительный. Поэтому, будучи загруженным в системное адресное пространство, драйвер становится частью системы и на него не накладываются какие-либо ограничения.

Таким образом пользовательские приложения отделены от собственно операционной системы. Если вы зададитесь целью написать сколь-нибудь серьезное приложение, для работы которого необходим доступ к внутренним функциям или структурам данных системы, то столкнетесь со множеством ограничений, преодолеть которые можно только разместив свой код в системном адресном пространстве. Из документированных существует только один способ это сделать - установить драйвер устройства. Способ этот относительно прост, надежен, а главное, полностью обеспечен поддержкой со стороны самой операционной системы.

Драйверы Windows 2000

Windows 2000 поддерживает множество типов драйверов устройств.

Существует два базовых, которые имеют своих представителей:

  • Драйверы пользовательского режима (User-Mode Drivers):
    • Драйверы виртуальных устройств (Virtual Device Drivers, VDD) - используются для поддержки программ MS-DOS (не путать с VxD драйверами в Windows 95/98 - это совсем разные вещи, хотя и имеют одно название);
    • Драйверы принтеров (Printer Drivers).
  • Драйверы режима ядра (Kernel-Mode Drivers):
    • Драйверы файловой системы (File System Drivers) - реализуют ввод-вывод на локальные и сетевые диски;
    • Унаследованные драйверы (Legacy Drivers) - написаны для предыдущих версий Windows NT;
    • Драйверы видеоадаптеров (Video Drivers) - реализуют графические операции;
    • Драйверы потоковых устройств (Streaming Drivers) - реализуют ввод-вывод видео и звука;
    • WDM-драйверы (Windows Driver Model, WDM) - поддерживают технологию Plag and Play и управления электропитанием. Их отличительной особенностью является совместимость на уровне исходного кода между Windows 98, Windows ME и Windows 2000.

В разных источниках вы можете встретить классификацию немного отличную от приведенной выше, это не суть важно. Важно то, что драйверы, которые мы будем писать, не подпадают ни под один из пунктов этой классификации. Это ни драйверы файловой системы, ни унаследованные драйверы, ни драйверы видеоадаптеров или звуковых карт, ни WDM-драйверы, т.к. не поддерживают Plag"n"Play и управление электропитанием. Это не драйверы пользовательского режима (это вообще не интересно). На самом деле это просто черт знает что такое, т.к. система сама позволяет легко и просто добавить в саму себя код непонятно для какого устройства, и делать с ней все что угодно! Это как если бы к вам ночью в дверь постучался совершенно незнакомый человек, и вы ни слова не говоря впустили бы его на ночлег, да еще уложили бы в свою постель! Однако, это не является каким-то багом или дырой в системе безопастности. Просто система работает так, как она работает. Иначе и быть не может, т.к. взаимодействуя с окружением, система вынуждена предоставлять к себе доступ. И если бы это было не так, то это была бы полностью закрытая, а значит, бесполезная система.

Как следует из самого названия, драйвер устройства это программа предназначенная для управления каким-то устройством, причем устройство это не обязательно должно быть физическим. Оно может быть логическим или, как в нашем случае, виртуальным.

По своей структуре драйвер устройства является ни чем иным как файлом PE-формата (Portable Executable, PE). Таким же как обычные exe и dll. Только загружается и работает по другим правилам. Драйверы можно рассматривать как DLL режима ядра, предназначенные для выполнения задач не решаемых из пользовательского режима. Принципиальная разница здесь (не считая уровня привилегий) в том, что мы не сможем напрямую обращаться к драйверу, ни к его коду, ни к его данным, а будем пользоваться специальным механизмом предоставляемым диспетчером ввода-вывода (Input/Output Manager). Диспетчер ввода-вывода обеспечивает среду для функционирования драйверов, а также предоставляет механизмы для их загрузки, выгрузки и управления ими.

Приступая к разработке драйверов режима ядра, вы почувствуете себя совершенным новичком, т.к. весь предыдущий опыт использования API тут не поможет - ядро предоставляет совершенно другой набор функций. Также придется пользоваться плохо документированными (определенными только в заголовочных файлах) или вовсе недокументированными функциями и структурами данных.

Одно- и многоуровневые драйверы

Большинство драйверов управляющих физическими устройствами являются многоуровневыми (layered drivers). Обработка запроса ввода-вывода разделяется между несколькими драйверами. Каждый выполняет свою часть работы. Например, запрос на чтение файла передается драйверу файловой системы, котрый, выполнив некоторые операции (например, разбиение запроса на несколько частей), передает его "ниже" - драйверу диска, а тот, в свою очередь, отправляет запрос драйверу шины. Кроме того между этими драйверами можно добавить любое количество драйверов-фильтров (например, шифрующих данные). Выполнив запрос нижестоящий драйвер (lower-level driver) передает его результаты "наверх" - вышестоящему (higher-level driver). Но, к счастью, у нас все будет значительно проще. Наши драйверы всегда будут одноуровневыми (monolithic drivers), что сильно упростит весь процесс их написания и отладки.

Контекст потока

Поскольку, в большинстве случаев, мы имеем всего один процессор, а приложений, которые нужно выполнять много, то естественно, что для создания иллюзии одновременного их выполнения надо последовательно подключать эти приложения к процессору, причем очень быстро. Эта процедура называется переключением контекста потока (thread context switching). Если система переключает контекст потоков принадлежащих одному процессу, то необходимо сохранить значение регистров процессора отключаемого потока, и загрузить, предварительно сохраненные значения регистров процессора подключаемого потока. И обновить кое-какие структуры данных. Если же подключаемый поток принадлежит другому процессу, то необходимо еще в регистр CR3 процессора загрузить указатель на каталог страниц (page directory) процесса. Так как каждому пользовательскому процессу предоставлено закрытое адресное пространство, то у разных процессов разные проекции адресных пространств, а значит, и разные каталоги страниц и наборы таблиц страниц по которым процессор транслирует виртуальные адреса в физические. Все это не имеет прямого отношения к программированию драйверов. Но я напоминаю об этом в связи вот с чем. Так как переключение контекста операция не самая быстрая, то драйверы, по соображениям лучшей производительности, как правило, не создают своих потоков. Но код драйвера все же нужно выполнять. Поэтому, для экономии времени на переключение контекстов, драйверы выполняются в режиме ядра в одном из трех контекстов:

  • в контексте пользовательского потока инициировавшего запрос ввода-вывода;
  • в контексте системного потока режима ядра (эти потоки принадлежат процессу System);
  • как результат прерывания (а значит, не в контексте какого-либо процесса или потока, который был текущим на момент прерывания).

Не совсем понимаю как можно выполнить что-то "не в контексте какого-либо процесса или потока", но учитывая авторитет людей это написавших (Д. Соломон и М. Руссинович), а также то, что нам это не понадобится, т.к. мы не будем обрабатывать ни программные, ни тем более, аппаратные прерывания, про третий случай можно сразу забыть. Остаются первые два варианта. Если инициируется запрос ввода-вывода, то мы в контексте потока этот запрос инициировавшего, и значит, можем напрямую обращаться к адресному пространству процесса которому этот поток принадлежит. Если мы в контексте системного потока, то ни к какому пользовательскому процессу обращаться напрямую не можем, а к системному мы и так всегда можем обратиться. Если нужно из драйвера посмотреть, что там у какого-нибудь процесса лежит по такому-то адресу, то придется либо самим переключать контекст, либо по таблицам страниц транслировать адреса.

Уровни запросов прерываний

Прерывание - неотъемлемая часть любой операционной системы. Прерывание требует обработки, поэтому выполнение текущего кода прекращается и управление передается обработчику прерывания. Существуют как аппаратные, так и программные прерывания. Прерывания обслуживаются в соответствии с их приоритетом. Windows 2000 использует схему приоритетов прерываний, известную под названием уровни запросов прерываний (interrupt request levels, IRQL). Всего существует 32 уровня, с 0 (passive), имеющего самый низкий приоритет, по 31 (high), имеющего соответственно самый высокий. Причем, прерывания с IRQL=0 (passive) по IRQL=2 (DPC\dispatch) являются программными, а прерывания с IRQL=3 (device 1) по IRQL=31 (high) являются аппаратными. Не путайте уровни приоритета прерываний с уровнями приоритетов потоков - это совсем разные вещи. Прерывание с уровнем IRQL=0, строго говоря, прерыванием не является, т.к. оно не может прервать работу никакого кода (ведь для этого этот код должен выполняться на еще более низком уровне прерывания, а такого уровня нет). На этом IRQL выполняются потоки пользовательского режима. И код наших драйверов тоже будет выполняться на этом IRQL. Это отнюдь не означает, что код любого драйвера всегда выполняется на уровне "passive". Просто мы не будем обрабатывать ни программные, ни тем более аппаратные прерывания. А отсюда следуют, по крайней мере, два очень важных вывода.

Первый: работа наших драйверов может быть в любой момент прервана, для обработки прерывания с более высоким приоритетом (например, от таймера, когда планировщик посчитает, что наш поток и так уже достаточно долго имеет процессор, и пора ему отдохнуть). Поэтому, в этом смысле, код наших драйверов является прерываемым и вытесняемым (процессор отдается другому потоку), точно также как и код любого пользовательского потока. Существуют функции ядра позволяющие узнать текущий уровень прерывания, а также повысить или понизить его.

Второй важный момент: на уровне прерывания passive можно вызывать любые функции ядра (в DDK в описании каждой функции обязательно указано, на каком уровне прерывания ее можно вызывать), а также обращаться к страницам памяти сброшенным в файл подкачки. На более высоких уровнях прерывания (DPC/dispath и выше), попытка обращения к странице отсутствующей в физической памяти приводит к краху системы, т.к. диспетчер памяти (Memory Manager) не может обработать ошибку страницы.

"Голубой экран смерти"

Думаю каждый, хотя бы один раз, видел волнующую картину под названием "голубой экран смерти" (Blue Screen Of Death, BSOD). Наверное, нет необходимости объяснять, что это такое и почему возникает. Важно здесь то, что взявшись за разработку драйверов режима ядра, приготовьтесь к тому, что BSOD дастаточно часто будет появляться на экране вашего монитора.

В третьем кольце все было просто: набросал примерный код, расставил int3 где надо, запустил и... в отладчике уже разбираешься что к чему. Если что-то не так - прибил, исправил ошибки, перекомпилировал... и так далее, до тех пор пока код не заработает как надо. При программировании драйверов об этой технике можно забыть. Тут "сапер" ошибается один раз. Одно неверное движение... и можно откинуться на спинку кресла и минутку расслабиться.

Для того чтобы видеть BSOD как можно реже следует придерживаться одного очень простого правила: "Семь раз отмерь - один отрежь"... в смысле "Семь раз проверь - один запусти". Это конечно просто сказать, но значительно труднее сделать. Но как правило, учитывая то, что структура драйверов, которые вы будете писать (после прочтения этих статей), относительно проста, можно разобраться с ошибками и до появления BSOD. Если же он упорно появляется перед вашими глазами, и вы никак не можете понять причину, возможным способом прояснить ситуацию является анализ аварийного дампа (crash dump). О том, что это такое, как его сделать и анализировать можно почитать в статье Марка Руссиновича "Анализ аварийных дампов памяти" http://www.osp.ru/win2000/2001/03/025.htm. Дело это (анализ) очень непростое, но думаю, что до этого не дойдет.

Теоретик из меня хреновый, так что все вышесказанное вы можете рассматривать как очень базовые сведения о тех принципах, которые совершенно необходимо понимать. Нельзя приступать к разработке драйверов режима ядра не имея понятия о том, что такое контекст потока, уровни прерываний и приоритеты потоков, режим ядра/пользователя и т.д. и т.п. Чувствуете себе неуверенно в каком-то вопросе - список литературы внизу.

Теперь осветим кое-какие более практические вещи (совсем практическими они станут в следующих статьях), а именно, что нам понадобится, чтобы всю эту теорию превратить в практику.

Driver Development Kit

Первое это конечно Комплект разработки драйверов устройств (Windows 2000 Driver Development Kit, 2KDDK), который можно свободно скачать с сайта Microsoft (во всяком случе я сливал его совершенно безвозмездно отсюда: http://www.microsoft.com/ddk/). В этот пакет входит документация, которая является богатым источником информации о внутренних структурах данных и внутрисистемных функциях используемых драйверами устройств.

Помимо документации в DDK входит набор библиотечных файлов (*.lib), которые будут совершенно необходимы при компоновке. В DDK входит два комплекта этих файлов: для окончательной версии Windows (называемой свободным выпуском (free build)); и для отладочной (называемой проверочным выпуском (checked build)). Находятся эти файлы в каталогах %ddk%\libfre\i386 и %ddk%\libchk\i386 соответственно. Отладочная версия отличается более строгой проверкой ошибок. Использовать нужно файлы соответствующие вашей версии системы поместив их в каталог \masm32\lib\w2k.

Включаемые файлы

Также нам понадобятся включаемые (*.inc) файлы с определениями прототипов функций. Их нам (точнее мне ) тоже придется делать самим. Я перепробовал много разных утилит, конвертирующих *.lib -> *.inc, как входящих в пакет masm32 by hutch, так и слитых мной в разное время с бескрайних просторов Internet. Из всех что имеются у меня в наличии, только protoize.exe by f0dder справилась со своей задачей, и мне практически ничего не пришлось править руками. Эта замечательная тулза будет лежать в каталоге \tools\protoize. Сайт автора: http://f0dder.didjitalyphrozen.com/. Только вы ее там не найдете. f0dder несколько раз постил эту утилиту в конференции http://board.win32asmcommunity.net/. Инклуды будут лежать в каталоге \include\w2k. Их следует поместить в каталог \masm32\include\w2k. Для конвертации использовались *.lib для свободного выпуска Windows 2000, т. к. у меня стоит именно этот вариант (и у вас, наверняка, тоже).

Следующая проблема более серьезна. Это практически полное отсутствие включаемых файлов с определениями необходимых структур, символьных констант и макросов. Найти что-либо путное в сети вы вряд ли сможете - уж слишком экзотическое это занятие - писать драйверы режима ядра на ассемблере. Кое-что можно найти у EliCZ http://www.anticracking.sk/EliCZ/. Кое-что у Y0da http://mitglied.lycos.de/yoda2k/index.htm (частично сделаное им самим, частично взятое у того же EliCZ). Но сделано это из рук вон плохо, (при всем моем глубоком уважении к нашим словакскому и немецкому коллегам): имена членов многих структур отличаются от определенных в оригинальных заголовочных файлах из DDK; вложенные структуры и обьединения не имеют имен; хотя в оригинале они именованы. И вообще, все находится в некотором беспорядке, и при просмотре вызывает удручающее впечатление. Неплохо сделан только ntstatus.inc. Частично это объясняется тем, что EliCZ начал создавать свои инклуды еще в отсутствие у него DDK (как он сам говорит). В любом случае, я не советую вам их использовать, по крайней мере без тщательной проверки. Кое-что, в свое время, мелькало в конференции http://board.win32asmcommunity.net/, но качество тоже не особо впечатляет. Короче, единственно правильное решение в данной ситуации - делать все самим, причем вручную, т. к. какие-либо тулзы, позволяющие автоматизировать этот процесс, мне не известны. Если вы, вдруг, наткнетесь на что-то стоящее, не сочтите за труд - дайте мне знать.

Отладка драйверов

Также нам потребуется отладчик, причем, поскольку отлаживать придется код режима ядра, то и отладчик нужен соответствующий. Самым лучшим выбором будет SoftICE. Или можно воспользоваться Kernel Debugger входящим в состав DDK. Этот отладчик требует двух компьютеров - ведущего и ведомого, что не каждый может себе позволить. Марк Руссинович (Mark Russinovich, http://www.sysinternals.com/) написал утилиту LiveKd, которая позволяет использовать Kernel Debugger без подключения второго компьютера. Не знаю есть ли она на сайте (не проверял), но на диске к книжке "Внутреннее устройство Microsoft Windows 2000" имеется. Также этот отладчик чрезвычайно полезен для исследования внутреннего устройства системы, при условии что у вас установлены отладочные символы, которые можно (или было можно) свободно скачать с сайта Microsoft.

  • Дэвид Соломон, Марк Руссинович, "Внутреннее устройство Microsoft Windows 2000", изд. "Питер", 2001.

    Хотя в этой книге нет ни одной строчки исходного кода, она прежде всего для программистов.

  • Свен Шрайбер, "Недокументированные возможности Windows 2000", изд. "Питер", 2002.

    Сугубо практическая книга, в которой раскрыто множество тайн Windows 2000.

  • Walter Oney, "Programming the Microsoft Driver Model", Microsoft Press, 1999

    В этой книге упор сделан на Plag"n"Play драйверы, но это нисколько не умоляет ее достоинств, т.к. базовые принципы разработки драйверов универсальны.

  • Джеффри Рихтер, "Windows для профессионалов: создание эффективных Win32-приложений с учетом специфики 64-разрядной версии Windows", изд. "Питер", 2000.

    Эта книжка не имеет никакого непосредственного отношения к программированию драйверов, но тоже очень интересная;-)

    Этот список ни в коем случае не претендует на полноту. Многое, особенно по английски, можно найти в Internet (кроме Шрайбера, все книги есть в электронном варианте). В отношении книг хочу сказать еще, что все они из разряда "must have". Увидите - покупайте не глядя. Все, кроме Walter"а Oney, переведены на наш "великий и могучий".

    И последнее. Я не являюсь большим специалистом в области разработки драйверов, так что ошибки или неточности, как в этой, так и во всех последующих статьях, весьма вероятны. Найдете - смело тыкайте носом. Скажу спасибо.

  • Вопрос: При долгой работе компьютера или выходе из спящего режима сбивается шрифт в меню пуск


    При долгой работе компьютера или выходе из спящего режима меню Пуск становится вот таким.

    Как исправить это? Помогите, пожалуйста..

    Ответ: переустановленная ОС уже и обновленная(

    Вопрос: Как перевести компьютер в спящий режим типа S1 ("Stand by") ?


    Ни на стационарном компьютере, ни на ноутбуке не могу понять, как перевести компьютер в спящий режим типа S1.

    Результат выполнения "powercfg /a"

    В данной системе доступны следующие состояния спящего режима:
    Ждущий режим (S3)

    Следующие состояния спящего режима недоступны в данной системе:
    Ждущий режим (S1)

    Ждущий режим (S2)
    Системное встроенное ПО не поддерживает ждущий режим.

    Гибернация
    Режим гибернации не включен.

    Ждущий режим (подключенный)
    Системное встроенное ПО не поддерживает ждущий режим.

    Гибридный спящий режим

    Быстрый запуск
    Режим гибернации недоступен.

    Ответ: Дайте компу постоять в бездействии пару минут, потом отправьте его в сон и разбудите.

    В журнале событий:
    Действие => создать настраиваемое представление
    В пункте дата задайте, например, двухминутный интервал и смотрите, что происходило.

    Больше у меня нет идей.

    Ну и проверить драйверы и подключенные к компу устройства

    Вопрос: Выходит из спящего режима в 4 утра


    Почти каждую ночь компьютер выходит из спящего режима и будит меня.
    в диспетчере устройств, сетевые адаптеры, снял галку "пробуждение с помощью магических пакетов".
    в настройках электропитания запретил таймеры пробуждения.
    в командной строке команда powercfg /waketimers вот что показывает.

    c:\>powercfg /waketimers
    Таймер, установленный Устаревшая вызывающая сторона ядра, действителен до 4:14:46 09.01.2016.
    Причина:

    Помогите. Кто виноват и что делать?

    Ответ: в конце концов вылечил сей недуг:

    Панель управления -> Безопасность и обслуживание -> Обслуживание -> Автоматическое обслуживание -> Изменить параметры обслуживания -> снимаем галку "Разрешить задаче обслуживания пробуждать мой компьютер..."

    Вопрос: Самопроизвольное включение компьютера по ночам


    Последнее время (около 1...2 месяцев) примерно через 30...60 минут после перевода компьютера в спящий режим (дабы можно было с утра продолжить работу с момента ее прерывания) он самопроизвольно включается. Завершаю работу около 12 ночи, т.е. включение происходит в 0:30...1:00 ночи. При этом монитор остается темным. Встаю с постели, подвигаю мышкой - монитор включается, вхожу в профиль в штатном режиме, снова ввожу в спящий режим - этой ночью больше не включается.

    На компьютере система Win7, стоит резидентный антивирус MS Cecurity Esentials. Прогнал по нескольку раз актуальные (свежескачанные) лечащие утилиты mbar и DrWeb Cureit - понаходили несколько бяк, но все равно самопроизвольное включение осталось. По проявлениям похоже на вирус, подключающий мой компьютер к DDOS-атакам. Тем более, что время от времени Google блокирует доступ по причине подозрительного траффика, исходящего с моего IP. Такое происходит уже довольно давно (больше года), но самопроизвольное включение компьютера я заметил вот только недавно.

    Собственно, вопрос: если беда известная и лечится относительно просто, то скачаю рекомендуемое ПО, просканирую им и выложу. Если же проблема более сложная - то не буду морочить голову ни себе, ни местным гуру и тупо переставлю систему.

    Ответ: Falconist , что-то я не совсем понял...

    Сообщение от Falconist

    после перевода компьютера в спящий режим... он самопроизвольно включается

    Спящий режим и режим гибернация в 7 - это совершенно разные вещи. Для перевода в спящий режим достаточно на клаве нажать кнопку Sleep. Если нажмёте Пуск и наведёте указатель мыши на стрелочку рядом с Завершение работы - появится меню в котором есть и Спящий режим. и Гибернация. При гибернации комп отключается от электропитания так же, как и при завершении работы, но при включении компа вы сможете начать работу так же, как и после режима сна.
    Но спрашивали вы о другом. Планировщик заданий проверяли?

    Вопрос: Компьютер ночью выходит из спящего режима


    Всем день добрый. Уже достала меня эта проблема. Сам по себе ПК выходит из спящего режима ночью, стоит Windows 10, до этого была 7, такой проблемы не было, поэтому выбрал именно этот раздел.
    Что уже было сделано 2 дня назад:
    1. В просмотре событий нашел причину: Таймер - Будет выполнено назначенное задание "NT TASK\Microsoft\Windows\UpdateOrchestrator\Reboot", запросившее вывод компьютера из спящего режима.
    Зашел в Планировщик заданий, нашел это задание и убрал галку с пункта: Условия - Пробуждать компьютер для выполнения задачи.
    2. Зашел в powercfg.cpl - Настройка схемы электропитания - Изменить дополнительные параметры питания - Сон - Разрешить таймеры пробуждения - ОТКЛЮЧИТЬ.

    Сегодня ночью ситуация повторилась, но в просмотре событий нашел лишь:

    Система вышла из состояния пониженного энергопотребления.

    Время перехода в спящий режим: 2016-10-29T21:38:38.657073700Z
    Время выхода из спящего режима: 2016-10-29T21:58:34.625754700Z

    Источник выхода: Нет данных

    3. В диспетчере устройств снял галку "разрешить этому устройству выводить компьютер из ждущего режима" с мышки, клавы, сетевух, и везде, где нашел...

    Помогите решить данную проблему, уже не знаю где копать...

    Ответ:

    Сообщение от GoLeMjkeee

    Стоит ежедневно в 2-00

    Поменяй на дневное.

    Сообщение от GoLeMjkeee

    но галочка.... не стоит.

    10-ка она такая,с характером.

    Вопрос: Как убрать экран с кнопкой "Вход" при выходе из спящего режима?


    Windows 10 Pro 1607.
    При выходе из спящего режима винда просит нажать "Вход". Пр пробуждении появляется синий экран с надписью имени пользователя и под ним кнопка "Вход". Пароль не установлен, пользователь единственный в системе с правами админа. При загрузке все нормально, никаких экранов и нажатий на кнопки, сразу рабочий стол.

    В Параметры-Учетные записи- Параметры входа нет пункта "Требуется вход".
    В окне Учетные записи пользователей, на вкладке Пользователи галка "Требовать ввод имени пользователя и пароля" снята.
    В настройках схемы электропитания нет пункта "Требовать введения пароля при пробуждении".

    Как убрать кнопку "Вход" при выходе из спящего режима, чтобы компьютер автоматически запускал рабочий стол минуя это окно?

    Ответ: убрать спящий режим

    Вопрос: Windows 8.1 выключается в спящем режиме


    Здравствуйте.
    У меня проблема со спящим режимом. Компьютер полностью выключается в спящем. Т.е. полностью питание пропадает. Раньше в спящем моргала лампочка на системнике, сейчас полностью "оптухает" и с usb тоже мышка, клава потухают и влючить можно только кнопкой включения и естественно вся инфа не сохраняется.
    Перечитал много тем в интернете, но ни одна проблема не похожа на мою.
    Сразу напишу характеристики ПК: материнка ASUS p8h67, видео Radeon HD7850 (asus), intel i5 2550k, 8gb ОЗУ, SSD Silicon Power s55 120gb, HDD WD 500gb.
    Установил Windows 8.1, стоит уже очень давно и спящий режим работал как надо. Однажды он перестал работать, я даже не знаю точно из-за чего и после чего (каких-нибудь действий) он перестал работать. ВРоде ничего такого не ставил, драйвера вроде не обновлял.
    Я частенько по привычке вместо выключения нажимаю спящий и однажды он заработал и работал несколько дней, но со временем перестал работать.
    Пробовал обновлять драйвера или удалять. Пробовал отключать от компа лишние устройства (ну мало ли). Отключал различные программы перед спящим. Ничего не помогло.
    В интернете нашёл единственную инфу которая точь в точь как у меня (пункт 8):

    Поставить драйвера я конечно не смог, разные платформы. Найти такие же для себя не смог.

    Переустанавливать ОС не хочу т.к. все (кроме спящего) работает хорошо.
    Может есть идеи что может быть не так?

    Добавлено через 17 минут
    Забыл написать, что BIOS сбрасывал и обновлял.

    Ответ: проверяй тогда либо БП либо Мать. Программно мы настроили спящий и гибернацию powercfg /h on.

    Ещё Вариант -- проверить (заменить). hiberfil.sys -- он отвечает за спящий режим.

    Вопрос: Спящий режим в windows 8


    после выхода из спящего режима windows 8 начинает перезагружаться и после загрузки windows вылетает следующее сообщение
    подскажите как с этим бороться?

    Ответ:

    Сообщение от azat145

    после выхода из спящего режима windows 8 начинает перезагружаться

    С начала.
    Потом.

    Вопрос: Гибридный спящий режим или Гибернация? Что предпочтительней на десктопе?


    В общем, вопрос в заголовке. Как я понял из поисковика, вернее, из скопипащенной на все сайты одной и той же статьи - преимущество Гибридного спящего режима только в скорости включения, просыпания, можно сказать. А если я хочу использовать на своей десктопной Виндовс 7 х64 режим Гибернации, есть подводные камни? Просто мне нужно выключать питание, а при Гибридном спящем режиме этого лучше не делать. Спасибо всем, кто откликнется

    Ответ: Читал, сегодня. Ладно, по-моему на мой вопрос другого ответа и нету, чем короткий брифинг от Майкрософта. Тогда поделюсь своими выводами (для тех, кто попадет в эту тему по похожему вопросу).
    Итак:

    Плюсы Гибридного спящего режима: 1. Быстрота включения, нет необходимости полностью вырубать компьютер;
    Минусы : 1. Нагружает жесткий диск (по утверждению одного модератора из раздела Windows 7 на нашем форуме); 2. Не выключается полностью, продолжает кушать ток, хоть и мало (хотя для некоторых этот пункт является плюсом)

    Короче, Гибернация нужна, если хочешь постоянно вырубать из сети, но не хочешь подолгу загружать/выключать ОС.
    Гибридный спящий режим - для тех, кого устраивает постоянно находящийся в сети ПК.

    Вопрос: Раньше ноутбук отключался на старте, теперь в спящем режиме


    Мой ноутбук DELL INSPIRON 3521 с Windows 8.1 раньше отключался на старте (появлялся логотип DELL – отключение – повторное включение и нормальная работа). Обновляла систему на 10ку, не помогло. Носила в горе-сервисный центр, известный в городе и хваленый – там ноутбук благополучно 2 недели отдохнул от человеческого внимания. Забрав его, исправила проблему отключением быстрой загрузки и на радостях вернулась на 8.1.
    Прошел уже месяц, и теперь, когда я закрываю крышку ноутбука, он переходит в спящий режим (так в настройках), но через минут 20 или чуть больше отключается вовсе (такого раньше не было и настройки электропитания не изменились). При включении ситуация, что я описала выше: включение – логотип – отключение. После повторного включения нормальная работа. Все драйверы обновлены. В чем может быть проблема и как исправить? Жалко бедолагу – полтора года всего, а у меня диплом и госы – не могу сейчас таскать по мастерам…

    Ответ: Как вы хоите чтобы он работал? Лично я использую гибернацию, а не спящий режим, так же включен переход в гибернацию при бездействи, настройки во вложении

    Перенос настроек электропитания

    Публикации по теме