Драйверы устройств в системе Windows

Приложение WINTEST


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

     Программа  MainDlgProc  вызывает  программу  BogusStart  во время выполнения WM_INITDIALOG,  передавая в  качестве параметра  обработчик окна  диалогового  блока.  Программа  ISR  регистрирует  сообщения   к данному  обработчику   в  тех   случаях,  когда   счетчик   прерываний изменяется от нуля к единице.

     Программа  MainDlgProc  сохраняет   текущее  суммарное   значение счетчика в переменной wCountTotal.  Всякий раз, когда диалог  получает сообщение  WM_COMMAND  с  параметром  wParam,  равным  IDM_BOGUSEVENT, программа  обновляет  суммарный  счетчик,  отображаемый  в  диалоговом блоке.  Следует   отметить,  что   хотя  программа   ISR  регистрирует сообщение только тогда,  когда счетчик изменяется  от нуля к  единице, возможна (и весьма вероятно) обработка количества прерываний до  того, как  сообщение   WM_COMMAND  фактически   будет  передано   диалоговой процедуре.  Методика,  показанная  в  данной  программе,  при  которой программа ISR  регистрирует сообщение  только при  первом переходе,  а программа  BogusCheck  чистит  счетчик,  обеспечивает  точный  подсчет количества прерываний,  даже если  на уровне  приложения нельзя учесть каждое прерывание в момент его возникновения.

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

_____________________________________________________________________

#include

#include "bogus.h"

#include "wintest.h"

HANDLE hPgmInstance ;

#define IDM_BOGUSEVENT  0x3000

void CenterWindow(HWND hWnd)

     {

     int xSize, ySixe, xPos, yPos ;



     RECT rc ;

     xSize = GetSystemMetrics(SM_CXSCREEN) ;




аааа ySize = GetSystemMetrics(SM_CYSCREEN) ;

аааа GetWindowRect(hWnd, &rc) ;

аааа xPos = (xSize - (rc.right - rc.left)) / 2 ;

аааа yPos = (ySize - (rc.bottom - rc.top)) / 2 ;

аааа SetWindowRect(hWnd, NULL, xPos, yPos, 0, 0,

аааааааа SWP_DRAWFRAME | SWP_NOSIZE | SWP_NOZORDER) ;

аааа }

LRESULT _loadds FAR PASCAL MainDlgProc(HWND hwndDlg,

UINT msg, WPARAM wParam, LPARAM lParam)

{

аааа static WORD wCountTotal = 0;

аааа WORD wCount ;

аааа lParam = lParam ;

аааа switch (msg)

аааа {

аааа case WM_INITDIALOG:

ааааааааа RemoveMenu(GetSystemMenu(hwndDlg,0),

SC_CLOSE,MF_BYCOMMAND) ;

ааааааааа BogusStart(hwndDlg, IDM_BOGUSEVENT) ;

ааааааааа break ;

аааа case WM_SHOWWINDOW:

ааааааааа if (wParam)

ааааааааа CenterWindow(hwndDlg) ;

ааааааааа break ;

аааа case WM_COMMAND:

ааааааааа switch (wParam)

ааааааааа {

ааааааааа case IDM_BOGUSEVENT:

аааааааааааааа wCount = BogusGetEvent() ;

аааааааааааааа while 9wCount)

аааааааааааааа {

аааааааааааааа wCountTotal += wCount ;

аааааааааааааа wCount = BogusGetEvent() ;

аааааааааааааа }

аааааааааааааа SetDlgItemInt(hwndDlg, IDM_COUNT, wCountTotal, FALSE);

аааааааааааааа break ;

ааааааааа case IDCANCEL:

аааааааааааааа EndDialog(hwndDlg, 0) ;

аааааааааааааа break ;

ааааааааа }

ааааааааа break ;

аааа default:

ааааааааа return FALSE ;

аааа }

аааа return TRUE ;

}

int PASCAL WinMain(HANDLE hInstance, HANDLE hPrevInstance,

LPSTR lpCmdLine, intnCmdShow)

{

аааа hPgmInstance = hInstance ;

аааа hPrevInstance = hPrevInstance ;

аааа lpCmdLine = lpCmdLine ;

аааа nCmdShow = nCmdShow ;

аааа if (!hPrevInstance)

аааа {

аааа if (BogusCheck())

ааааааааа {

ааааааааа if (MessageBox(0, "Press OK to begin bogus I/O",

аааааааааааааааааа "WinTest", MB_OKCANCEL|MB_APPLMODAL) == IDOK)

ааааааааа {

ааааааааа DialogBox(hPgmInstance, "MainDlg", 0,

аааааааааааааааааа (FARPROC) MainDlgProc) ;

ааааааааа BogusStop() ;

ааааааааа }

ааааааааа }

аааа else

ааааааааа MessageBox(0, "Bogus device not found", "WinTest",

MB_ICOMMAND|MB_OK|MB_APPLMODAL) ;

аааа }

аааа else

аааа MessageBox(0, "Another instance already running",

аа "WinTest", MB_ICONEXCLAMATION|MB_OK|MB_APPLMODAL) ;

аааа return 0 ;

}

______________________________________________________________________

а аааTшёЄшэу 5. ¦ЁюуЁрььр wintest.c.


Содержание раздела