| | ||
Типы драйверов и характеристики
В NT существует два типа
драйверов: драйверы пользовательского режима и драйверы режима ядра. В дальнейшем,
говоря «драйвер», мы будем подразумевать драйвер режима ядра. Такие драйверы являются
частью исполнительной системы, а более точно - элементами диспетчера ввода/вывода
(архитектура NT и ее компоненты будут обсуждаться ниже). Как следует из названия,
при работе драйвера режима ядра процессор находится в режиме ядра (RING 0 - см.
любой справочник по защищенному режиму работы процессора).
Драйвер NT располагается
в файле с расширением .sys и имеет стандартный РЕ-формат (РЕ - Portable Executable).
Драйверы реализованы как самостоятельные модули с четко определенным интерфейсом
взаимодействия с ОС. Все драйверы имеют определенный системой набор стандартных
функций драйвера (standard driver routines) и некоторое число внутренних функций,
определенных разработчиком.
Драйверы режима ядра можно разбить на три типа:
Как будет показано
ниже, такое разбиение обусловлено многоуровневой моделью драйверов (layered driver
model). Для сохранения общности изложения, монолитный драйвер можно включить в
эту схему, хотя он не использует многоуровневую архитектуру. В этом случае он
будет «гибридом» - драйвером, принадлежащим одновременно к нескольким типам. Например,
монолитный драйвер, имеющий интерфейс с приложением и осуществляющий доступ к
оборудованию, будет одновременно драйвером высшего и низшего уровня.
Кроме
того, в зависимости от назначения драйвера, он может являться каким-либо специализированным
драйвером, то есть удовлетворять дополнительному набору требований к своей структуре.
Стартовая заготовка приложения Win32
Если вы знакомы со структурой приложения Win32, то можете безболезненно пропустить несколько параграфов и перейти к параграфу с заголовком «Развитие начальной заготовки».
Рассмотрим более подробно структуру традиционного Windows-приложения, представленную нам мастером Win32 Application Wizard Studio.Net. Программа спроектирована как шаблон (стартовая заготовка), который можно развивать, внося в него желаемую разработчиком функциональность.
Создайте новый проект приложения Win32. Для этого:
Запустите стартовую заготовку и убедитесь, что она создает окно с планкой меню
и реагирует на shortcut-комбинацию Alt+? или Alt+/, создавая диалог About. Раскройте
дерево в окне Class View студии и щелкните два раза имя глобальной переменной
hlnst. Курсор переходит в окно редактора, где вы видите заготовку традиционного
приложения Win32. Надо отметить, что она богаче оснащена, чем аналогичные заготовки
предыдущих версий Visual C++. Кроме пяти функций здесь содержатся ресурсы (меню,
диалог, значок, строки текста, и клавиатурный ускоритель). Вы можете убедиться
в этом, раскрыв дерево ресурсов в окне Resource View, которое входит в блок страниц
вместе с окном Class View. Анализ и развитие этой заготовки мы произведем немного
позже, а сейчас приведем листинг, который создал мастер Win32 Application Wizard.
1
// API.cpp : Определяет точку входа приложения
//
#include "stdafx.h"
#include "API.h"
#define MAX_LOADSTRING 100
//======== Глобальные переменные:
HINSTANCE hlnst;
// Текущий экземпляр
TCHAR szTitle[MAX_LOADSTRING];
// Текст заголовка окна
TCHAR szWindowClass[MAX_LOADSTRING];
// Текст регистрации
//======== Прототипы функций, входящих в данный модуль
ATOM MyRegisterClass(HINSTANCE hlnstance);
BOOL Initlnstance(HINSTANCE, int);
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
LRESULT CALLBACK
About(HWND, UINT, WPARAM, LPARAM);
int APIENTRY WinMain(HINSTANCE hlnstance,
HINSTANCE hPrevInstance,
LPSTR IpCmdLine,
int nCmdShow)
{
//======= TODO: Помещайте код здесь
MSG msg;
HACCEL hAccelTable;
//======= Инициализация глобальных строк текста
LoadString(hlnstance,
IDS_APP_TITLE, szTitle, MAX_LOADSTRING); LoadString(hlnstance, IDC_API, szWindowClass,
MAX_LOADSTRING);
//======= Вызов функции регистрации приложения
MyRegisterClass(hlnstance);
//======= Инициализация приложения:
if (!Initlnstance (hlnstance, nCmdShow))
{
return FALSE;
}
//======= Загрузка клавиатурных ускорителей
hAccelTable = LoadAccelerators
(hlnstance, (LPCTSTR)IDC_API);
//======= Цикл ожидания и обработки сообщений:
while (GetMessage(&msg,
NULL, 0, 0))
if (!TranslateAccelerator(msg.hwnd, hAccelTable, Smsg))
{
TranslateMessage(Smsg);
DispatchMessage(Srasg);
}
}
return msg.wParam;
}
//
// FUNCTION: MyRegisterClass ()
//
// НАЗНАЧЕНИЕ: Регистрирует оконный класс
//
// COMMENTS: //
// Эта функция нужна только если вы хотите, чтобы код
// был совместим с Win32 системами, которые
// существовали до создания функции 'RegisterClassEx ' ,
// введенной в Windows
95.
// Вызов 'RegisterClassEx' необходим для правильного
// создания маленького (small) значка, ассоциированного
// с приложением.
//
ATOM MyRegisterClass (HINSTANCE hlnstance)
{
WNDCLASSEX wcex;
wcex.cbSize = sizeof (WNDCLASSEX) ;
wcex. style = CS_HREDRAW | CS_VREDRAW;
wcex.lpfnWndProc = (WNDPROC) WndProc;
wcex. cbClsExtra = 0;
wcex.cbWndExtra = 0;
wcex. hlnstance = hlnstance;
wcex.hlcon = Loadlcon (hlnstance,
(LPCTSTR) IDI_API) ;
wcex.hCursor = LoadCursor (NULL, IDC_ARROW) ;
wcex.hbrBackground
= (HBRUSH) (COLOR_WINDOW+1) ;
wcex.lpszMenuName = (LPCSTR) IDC_API;
wcex. IpszClassName = szWindowClass;
wcex.hlconSm = Loadlcon (wcex. hlnstance, (LPCTSTR) IDI_SMALL)
return RegisterClassEx (&wcex) ;
}
//
// FUNCTION: Initlnstance (HANDLE, int)
//
// НАЗНАЧЕНИЕ: Запоминание описателя экземпляра
// приложения и создание главного окна приложения
//
// COMMENTS:
// В этой функции мы запоминаем описатель экземпляра
// приложения в глобальной переменной и создаем
// главное окно приложения.
//
BOOL Initlnstance(HINSTANCE hlnstance, int nCmdShow)
{
HWND hWnd;
//======= Запоминаем экземпляр приложения
hlnst = hlnstance;
//======= Создаем главное окно
hWnd = CreateWindow(szWindowClass, szTitle, WSJDVERLAPPEDWINDOW,CW_USEDEFAULT,
0, CW_USEDEFAULT, 0, NULL, NULL, hlnstance, NULL),
if (IhWnd)
{
return FALSE; }
ShowWindow(hWnd, nCmdShow);
UpdateWindow(hWnd) ;
return TRUE; }
//
// FUNCTION: WndProc(HWND, unsigned, WORD, LONG)
//
// НАЗНАЧЕНИЕ: Обработка
сообщений главного окна.
//
// WM_COMMAND - обработка команд меню
// WM_PAINT - перерисовка окна
// WM_DESTROY - посылка сообщения о завершении и выход
//
//
LRESULT CALLBACK
WndProc (HWND hWnd, UINT message,
WPARAM wParam, LPARAM IParam)
{
int wmld, wmEvent;
PAINTSTRUCT ps;
HDC hdc;
switch (message)
{
case WM_COMMAND:
wmld = LOWORD (wParam) ;
wmEvent - HIWORD (wParam) ;
//====== Расшифровка выбора в меню:
switch (wmld)
{
case IDM_ABOUT:
DialogBox (hlnst, (LPCTSTR) IDD_ABOUTBOX, hWnd,
(DLGPROC)About) ;
break;
case IDM_EXIT:
DestroyWindow(hWnd);
break;
default:
return DefWindowProc(hWnd, message, wParam, IParara);
{
break;
//======= Ветвь перерисовки содержимого окна
case WM_PAINT:
hdc = BeginPaint(hWnd, sps);
//======= TODO: Вставьте сюда рисующий код
EndPaint(hWnd, Sps);
break; //======= Ветвь закрытия окна
case WM_DESTROY:
PostQuitMessage(0);
break; default:
return DefWindowProc(hWnd, message, wParam, IParam);
}
return 0;
}
//======= Обработчик команды вызова диалога About
LRESULT CALLBACK
About(HWND hDlg, UINT message,
WPARAM wParam, LPARAM IParam)
{
switch (message)
{
//======= Ветвь инициализации окна диалога
case WM_INITDIALOG:
return TRUE;
//======= Ветвь обработки команд, исходящих
//======= от элементов
управления диалога
case WM_COMMAND:
if (LOWORD(wParam) == IDOK ||
LOWORD(wParam) == IDCANCEL)
EndDialog(hDlg, LOWORD(wParam));
return TRUE;
}
break;
}
return FALSE;
}
| ; |
| Распродажа в магазине МИР: кулер для воды . Выбираете кулер для воды?Атомные станции с реакторами РБМК 1000 Преобразование
энергии на АЭС
Конструкция реактора РБМК-1000
Турбина реакторной установки
Сепаратор-пароперегреватель Насосы
атомной станции с реактором РБМК
Система радиационного контроля
Атомные станции с реакторами ВВЭР
Система управления и контроля Атомные
станции с реакторами БН-600
Высшая Математика Курс лекций -
1 семестр Интегралы - второй семестр
примеры решения задач Конспекты - третий семестр Производная
- 4 семестр ТФКП теория функции Дифференциалы
задачи Mathematica учебник Ядерное
разоружение Ядерные испытания
Ядерная физика MATLAB электронный
учебник Maple 7 математический анализ
Первообразная
курсовые задания Типовой по Кузнецову Смоленская
АЭС Чернобыльская катастрофа
|