Не работает драйвер (должен пищать системным динамиком)

Тема в разделе "WASM.BEGINNERS", создана пользователем AssemblerIA64, 9 янв 2009.

  1. AssemblerIA64

    AssemblerIA64 New Member

    Публикаций:
    0
    Регистрация:
    7 окт 2007
    Сообщения:
    160
    Почитав первые статьи из цикла "Драйверы режима ядра" (http://wasm.ru/series.php?sid=9), решил попровать сделать что-нибудь сам. Так вот, мой драйвер не пищит, а просто остаётся висеть в системе. Подскажите, пожалуйста, где ошибка. Спасибо.

    Код (Text):
    1. ;@echo off
    2. ;goto make
    3.  
    4. .586
    5. .MODEL flat, stdcall
    6. option casemap: none
    7.  
    8. include \masm32\include\w2k\ntstatus.inc
    9. include \masm32\include\w2k\ntddk.inc
    10. ;include \masm32\include\w2k\ntdef.inc
    11.  
    12. includelib wdm.lib
    13.  
    14. KeDelayExecutionThread PROTO STDCALL :KPROCESSOR_MODE, :BOOLEAN, :PLARGE_INTEGER
    15.  
    16. SPINLOCK_FREE   EQU 0
    17. SPINLOCK_BUSY   EQU 1
    18.  
    19. TIMER_FREQUENCY = 1193167
    20.  
    21. c1  EQU 130
    22. d1  EQU 147
    23. e1  EQU 165
    24. f1  EQU 175
    25. g1  EQU 197
    26. a1  EQU 220
    27. b1  EQU 247
    28.  
    29. c2  EQU 262
    30. d2  EQU 294
    31. e2  EQU 330
    32.  
    33. .code
    34.  
    35. MakeBeepE PROC Tone: DWORD
    36. LOCAL   Spinlock: BYTE
    37.  
    38.     lea edi, Spinlock
    39.     mov edx, SPINLOCK_BUSY
    40.    
    41.     cli
    42. wait_cycle:
    43.     lock xchg [edi], edx
    44.     cmp edx, SPINLOCK_FREE
    45.     jne wait_cycle
    46.    
    47.     mov al, 0B6h
    48.     out 43h, al
    49.  
    50.     mov eax, Tone
    51.     out 42h, al
    52.     mov al, ah
    53.     out 42h, al
    54.  
    55.     in  al, 61h
    56.     or  al, 3
    57.     out 61h, al
    58.  
    59.    
    60.     mov     DWORD PTR (LARGE_INTEGER PTR [esi]).QuadPart, ebx
    61.     mov     DWORD PTR (LARGE_INTEGER PTR [esi]).QuadPart + 4 , 0
    62.    
    63.     invoke KeDelayExecutionThread, KernelMode, FALSE, esi
    64.  
    65.     in  al, 61h
    66.     and al, 0FCh
    67.     out 61h, al
    68.    
    69.     lea edi, Spinlock
    70.     mov edx, SPINLOCK_FREE
    71.     lock    xchg    [edi], edx
    72.  
    73.     sti
    74.    
    75.     ret
    76. MakeBeepE   ENDP
    77.  
    78.  
    79. DriverEntry PROC pDriverObject: PDRIVER_OBJECT, pusRegistryPath: PUNICODE_STRING
    80.  
    81. LOCAL DelayTime: LARGE_INTEGER
    82.    
    83.     lea esi, DelayTime
    84.     mov ebx, 10000*250
    85.     invoke  MakeBeepE, (TIMER_FREQUENCY / g1)
    86.     mov ebx, 10000*750
    87.     invoke  MakeBeepE, (TIMER_FREQUENCY / c2)
    88.     mov ebx, 10000*500
    89.     invoke  MakeBeepE, (TIMER_FREQUENCY / g1)
    90.     mov ebx, 10000*250
    91.     invoke  MakeBeepE, (TIMER_FREQUENCY / a1)
    92.     mov ebx, 10000*750
    93.     invoke  MakeBeepE, (TIMER_FREQUENCY / b1)
    94.     mov ebx, 10000*500
    95.     invoke  MakeBeepE, (TIMER_FREQUENCY / e1)
    96.     mov ebx, 10000*250
    97.     invoke  MakeBeepE, (TIMER_FREQUENCY / c1)
    98.     mov ebx, 10000*750
    99.     invoke  MakeBeepE, (TIMER_FREQUENCY / a1)
    100.     mov ebx, 10000*500
    101.     invoke  MakeBeepE, (TIMER_FREQUENCY / g1)
    102.     mov ebx, 10000*250
    103.     invoke  MakeBeepE, (TIMER_FREQUENCY / f1)
    104.     mov ebx, 10000*750
    105.     invoke  MakeBeepE, (TIMER_FREQUENCY / g1)
    106.     mov ebx, 10000*500
    107.     invoke  MakeBeepE, (TIMER_FREQUENCY / c1)
    108.    
    109.     mov     DWORD PTR (LARGE_INTEGER PTR [esi]).QuadPart, 50*10000
    110.     mov     DWORD PTR (LARGE_INTEGER PTR [esi]).QuadPart + 4 , 0
    111.  
    112.     invoke KeDelayExecutionThread, KernelMode, FALSE, ADDR DelayTime
    113.    
    114.     mov ebx, 10000*375
    115.     invoke  MakeBeepE, (TIMER_FREQUENCY / c1)
    116.     mov ebx, 10000*750
    117.     invoke  MakeBeepE, (TIMER_FREQUENCY / d1)
    118.     mov ebx, 10000*375
    119.     invoke  MakeBeepE, (TIMER_FREQUENCY / d1)
    120.     mov ebx, 10000*375
    121.     invoke  MakeBeepE, (TIMER_FREQUENCY / c1)
    122.     mov ebx, 10000*750
    123.     invoke  MakeBeepE, (TIMER_FREQUENCY / f1)
    124.     mov ebx, 10000*375
    125.     invoke  MakeBeepE, (TIMER_FREQUENCY / f1)
    126.     mov ebx, 10000*375
    127.     invoke  MakeBeepE, (TIMER_FREQUENCY / g1)
    128.     mov ebx, 10000*750
    129.     invoke  MakeBeepE, (TIMER_FREQUENCY / a1)
    130.     mov ebx, 10000*375
    131.     invoke  MakeBeepE, (TIMER_FREQUENCY / b1)
    132.     mov ebx, 10000*375
    133.     invoke  MakeBeepE, (TIMER_FREQUENCY / c2)
    134.     mov ebx, 10000*1000
    135.     invoke  MakeBeepE, (TIMER_FREQUENCY / d2)
    136.    
    137.     mov eax, STATUS_DEVICE_CONFIGURATION_ERROR
    138.     ret
    139.    
    140. DriverEntry ENDP
    141. END DriverEntry
    142.  
    143. :make
    144. J:\masm32\bin\ml.exe /c /coff drv.bat
    145. J:\masm32\bin\link.exe /driver /base:0x10000 /align:32 /out:drv.sys /subsystem:native drv.obj
    146. pause
     
  2. murder

    murder Member

    Публикаций:
    0
    Регистрация:
    3 июн 2007
    Сообщения:
    628
    Наверное здесь
    Код (Text):
    1. wait_cycle:
    2.     lock xchg [edi], edx
    3.     cmp edx, SPINLOCK_FREE
    4. jne wait_cycle
     
  3. AssemblerIA64

    AssemblerIA64 New Member

    Публикаций:
    0
    Регистрация:
    7 окт 2007
    Сообщения:
    160
    Ну хорошо, написал так:
    Код (Text):
    1. wait_cycle:
    2.     lock xchg [edi], edx
    3.     cmp edx, SPINLOCK_BUSY
    4. je  wait_cycle
    Теперь показывается BSOD.
    Кстати, ещё подправил:
    Код (Text):
    1.     cli
    2.     mov     DWORD PTR (LARGE_INTEGER PTR [esi]).QuadPart, ebx
    3.     mov     DWORD PTR (LARGE_INTEGER PTR [esi]).QuadPart + 4 , 0
    4.    
    5.     invoke KeDelayExecutionThread, KernelMode, FALSE, esi
    6.     sti
    Но это тоже не помогло.
     
  4. AssemblerIA64

    AssemblerIA64 New Member

    Публикаций:
    0
    Регистрация:
    7 окт 2007
    Сообщения:
    160
    Извините, что так долго меня не было.
    Переписал код, запустил под VMware (в вирт. системе 1 процессор), посмотрел отладчиком.
    Новый код:
    Код (Text):
    1. ;@echo off
    2. ;goto make
    3.  
    4. .586p
    5. .MODEL flat, stdcall
    6. option casemap: none
    7.  
    8. include \masm32\include\w2k\ntstatus.inc
    9. include \masm32\include\w2k\ntddk.inc
    10. include \masm32\include\w2k\ntoskrnl.inc
    11. ;include \masm32\include\w2k\ntdef.inc
    12.  
    13. includelib wdm.lib
    14.  
    15. ;KeDelayExecutionThread PROTO STDCALL :KPROCESSOR_MODE, :BOOLEAN, :PLARGE_INTEGER
    16.  
    17.  
    18. TIMER_FREQUENCY = 1193167
    19.  
    20. c1  EQU 130
    21. d1  EQU 147
    22. e1  EQU 165
    23. f1  EQU 175
    24. g1  EQU 197
    25. a1  EQU 220
    26. b1  EQU 247
    27.  
    28. c2  EQU 262
    29. d2  EQU 294
    30. e2  EQU 330
    31.  
    32. .code
    33.  
    34. DelayTime:
    35.     dd  ?
    36.     dd  0
    37.  
    38.  
    39. MakeBeepE PROC
    40.     cli
    41.     mov al, 0B6h
    42.     out 43h, al
    43.  
    44.     mov eax, edx
    45.     out 42h, al
    46.     mov al, ah
    47.     out 42h, al
    48.  
    49.     in  al, 61h
    50.     or  al, 3
    51.     out 61h, al
    52.     sti
    53.    
    54.     push    esi
    55.     mov     DWORD PTR [esi], ebx
    56.     invoke KeDelayExecutionThread, KernelMode, FALSE, esi
    57.     pop esi
    58.    
    59.     cli
    60.     in  al, 61h
    61.     and al, 0FCh
    62.     out 61h, al
    63.     sti
    64.    
    65.     ret
    66. MakeBeepE   ENDP
    67.  
    68.  
    69. DriverEntry PROC pDriverObject: PDRIVER_OBJECT, pusRegistryPath: PUNICODE_STRING
    70.    
    71.     invoke  DbgBreakPoint
    72.     lea esi, DelayTime
    73.     mov ebx, 10000*250
    74.     mov edx, (TIMER_FREQUENCY / g1)
    75.     invoke  MakeBeepE
    76.     mov ebx, 10000*750
    77.     mov edx, (TIMER_FREQUENCY / c2)
    78.     invoke  MakeBeepE
    79.     mov ebx, 10000*500
    80.     mov edx, (TIMER_FREQUENCY / g1)
    81.     invoke  MakeBeepE
    82.     mov ebx, 10000*250
    83.     mov edx, (TIMER_FREQUENCY / a1)
    84.     invoke  MakeBeepE
    85.     mov ebx, 10000*750
    86.     mov edx, (TIMER_FREQUENCY / b1)
    87.     invoke  MakeBeepE
    88.     mov ebx, 10000*500
    89.     mov edx, (TIMER_FREQUENCY / e1)
    90.     invoke  MakeBeepE
    91.     mov ebx, 10000*250
    92.     mov edx, (TIMER_FREQUENCY / c1)
    93.     invoke  MakeBeepE
    94.     mov ebx, 10000*750
    95.     mov edx, (TIMER_FREQUENCY / a1)
    96.     invoke  MakeBeepE
    97.     mov ebx, 10000*500
    98.     mov edx, (TIMER_FREQUENCY / g1)
    99.     invoke  MakeBeepE
    100.     mov ebx, 10000*250
    101.     mov edx, (TIMER_FREQUENCY / f1)
    102.     invoke  MakeBeepE
    103.     mov ebx, 10000*750
    104.     mov edx, (TIMER_FREQUENCY / g1)
    105.     invoke  MakeBeepE
    106.     mov ebx, 10000*500
    107.     mov edx, (TIMER_FREQUENCY / c1)
    108.     invoke  MakeBeepE
    109.    
    110.     mov     DWORD PTR [DelayTime], 50*10000
    111.     invoke KeDelayExecutionThread, KernelMode, FALSE, OFFSET DelayTime
    112.    
    113.     mov ebx, 10000*375
    114.     mov edx, (TIMER_FREQUENCY / c1)
    115.     invoke  MakeBeepE
    116.     mov ebx, 10000*750
    117.     mov edx, (TIMER_FREQUENCY / d1)
    118.     invoke  MakeBeepE
    119.     mov ebx, 10000*375
    120.     mov edx, (TIMER_FREQUENCY / d1)
    121.     invoke  MakeBeepE
    122.     mov ebx, 10000*375
    123.     mov edx, (TIMER_FREQUENCY / c1)
    124.     invoke  MakeBeepE
    125.     mov ebx, 10000*750
    126.     mov edx, (TIMER_FREQUENCY / f1)
    127.     invoke  MakeBeepE
    128.     mov ebx, 10000*375
    129.     mov edx, (TIMER_FREQUENCY / f1)
    130.     invoke  MakeBeepE
    131.     mov ebx, 10000*375
    132.     mov edx, (TIMER_FREQUENCY / g1)
    133.     invoke  MakeBeepE
    134.     mov ebx, 10000*750
    135.     mov edx, (TIMER_FREQUENCY / a1)
    136.     invoke  MakeBeepE
    137.     mov ebx, 10000*375
    138.     mov edx, (TIMER_FREQUENCY / b1)
    139.     invoke  MakeBeepE
    140.     mov ebx, 10000*375
    141.     mov edx, (TIMER_FREQUENCY / c2)
    142.     invoke  MakeBeepE
    143.     mov ebx, 10000*1000
    144.     mov edx, (TIMER_FREQUENCY / d2)
    145.     invoke  MakeBeepE
    146.    
    147.     mov eax, STATUS_DEVICE_CONFIGURATION_ERROR
    148.     ret
    149.    
    150. DriverEntry ENDP
    151.  
    152.  
    153. END DriverEntry
    154.  
    155. :make
    156. \masm32\bin\ml.exe /c /coff xxxx.bat
    157. \masm32\bin\link.exe /driver /base:0x10000 /align:32 /out:xxxx.sys /subsystem:native xxxx.obj
    158. pause
    Отладчик показал, что ошибка возникла при выгрузке драйвера по адресу nt!IopLoadDriver+0x68c. Из-за чего это?
     
  5. AssemblerIA64

    AssemblerIA64 New Member

    Публикаций:
    0
    Регистрация:
    7 окт 2007
    Сообщения:
    160
    Переписал по-нормальному (раньше не хотел собираться с сегментом данных):
    Код (Text):
    1. ;@echo off
    2. ;goto make
    3.  
    4. .586p
    5. .MODEL flat, stdcall
    6. option casemap: none
    7.  
    8. include \masm32\include\w2k\ntstatus.inc
    9. include \masm32\include\w2k\ntddk.inc
    10. include \masm32\include\w2k\ntoskrnl.inc
    11. ;include \masm32\include\w2k\ntdef.inc
    12.  
    13. includelib wdm.lib
    14.  
    15. ;KeDelayExecutionThread PROTO STDCALL :KPROCESSOR_MODE, :BOOLEAN, :PLARGE_INTEGER
    16.  
    17.  
    18. TIMER_FREQUENCY = 1193167
    19.  
    20. c1  EQU 130
    21. d1  EQU 147
    22. e1  EQU 165
    23. f1  EQU 175
    24. g1  EQU 197
    25. a1  EQU 220
    26. b1  EQU 247
    27.  
    28. c2  EQU 262
    29. d2  EQU 294
    30. e2  EQU 330
    31.  
    32. .data
    33.     DelayTime   DD  ?
    34.             DD  ?      
    35.        
    36.  
    37. .code
    38.  
    39.  
    40. MakeBeepE PROC
    41.  
    42.     cli
    43.     mov al, 0B6h
    44.     out 43h, al
    45.  
    46.     mov eax, edx
    47.     out 42h, al
    48.     mov al, ah
    49.     out 42h, al
    50.  
    51.     in  al, 61h
    52.     or  al, 3
    53.     out 61h, al
    54.     sti
    55.    
    56.     mov esi, OFFSET DelayTime
    57.     mov DWORD PTR [esi], ebx
    58.     mov DWORD PTR [esi+4], 0
    59.    
    60.     invoke KeDelayExecutionThread, KernelMode, FALSE, esi
    61.    
    62.     cli
    63.     in  al, 61h
    64.     and al, 0FCh
    65.     out 61h, al
    66.     sti
    67.    
    68.     ret
    69. MakeBeepE   ENDP
    70.  
    71.  
    72. DriverEntry PROC pDriverObject: PDRIVER_OBJECT, pusRegistryPath: PUNICODE_STRING
    73.     invoke  DbgBreakPoint
    74.     pushad
    75.    
    76.     xor esi, esi
    77.     mov ebx, 10000*250
    78.     mov edx, (TIMER_FREQUENCY / g1)
    79.     invoke  MakeBeepE
    80.     mov ebx, 10000*750
    81.     mov edx, (TIMER_FREQUENCY / c2)
    82.     invoke  MakeBeepE
    83.     mov ebx, 10000*500
    84.     mov edx, (TIMER_FREQUENCY / g1)
    85.     invoke  MakeBeepE
    86.     mov ebx, 10000*250
    87.     mov edx, (TIMER_FREQUENCY / a1)
    88.     invoke  MakeBeepE
    89.     mov ebx, 10000*750
    90.     mov edx, (TIMER_FREQUENCY / b1)
    91.     invoke  MakeBeepE
    92.     mov ebx, 10000*500
    93.     mov edx, (TIMER_FREQUENCY / e1)
    94.     invoke  MakeBeepE
    95.     mov ebx, 10000*250
    96.     mov edx, (TIMER_FREQUENCY / c1)
    97.     invoke  MakeBeepE
    98.     mov ebx, 10000*750
    99.     mov edx, (TIMER_FREQUENCY / a1)
    100.     invoke  MakeBeepE
    101.     mov ebx, 10000*500
    102.     mov edx, (TIMER_FREQUENCY / g1)
    103.     invoke  MakeBeepE
    104.     mov ebx, 10000*250
    105.     mov edx, (TIMER_FREQUENCY / f1)
    106.     invoke  MakeBeepE
    107.     mov ebx, 10000*750
    108.     mov edx, (TIMER_FREQUENCY / g1)
    109.     invoke  MakeBeepE
    110.     mov ebx, 10000*500
    111.     mov edx, (TIMER_FREQUENCY / c1)
    112.     invoke  MakeBeepE
    113.    
    114.  
    115.     mov esi, OFFSET DelayTime
    116.     mov DWORD PTR [esi], 50*10000
    117.     mov DWORD PTR [esi+4], 0
    118.     invoke KeDelayExecutionThread, KernelMode, FALSE, esi
    119.    
    120.     mov ebx, 10000*375
    121.     mov edx, (TIMER_FREQUENCY / c1)
    122.     invoke  MakeBeepE
    123.     mov ebx, 10000*750
    124.     mov edx, (TIMER_FREQUENCY / d1)
    125.     invoke  MakeBeepE
    126.     mov ebx, 10000*375
    127.     mov edx, (TIMER_FREQUENCY / d1)
    128.     invoke  MakeBeepE
    129.     mov ebx, 10000*375
    130.     mov edx, (TIMER_FREQUENCY / c1)
    131.     invoke  MakeBeepE
    132.     mov ebx, 10000*750
    133.     mov edx, (TIMER_FREQUENCY / f1)
    134.     invoke  MakeBeepE
    135.     mov ebx, 10000*375
    136.     mov edx, (TIMER_FREQUENCY / f1)
    137.     invoke  MakeBeepE
    138.     mov ebx, 10000*375
    139.     mov edx, (TIMER_FREQUENCY / g1)
    140.     invoke  MakeBeepE
    141.     mov ebx, 10000*750
    142.     mov edx, (TIMER_FREQUENCY / a1)
    143.     invoke  MakeBeepE
    144.     mov ebx, 10000*375
    145.     mov edx, (TIMER_FREQUENCY / b1)
    146.     invoke  MakeBeepE
    147.     mov ebx, 10000*375
    148.     mov edx, (TIMER_FREQUENCY / c2)
    149.     invoke  MakeBeepE
    150.     mov ebx, 10000*1000
    151.     mov edx, (TIMER_FREQUENCY / d2)
    152.     invoke  MakeBeepE
    153.    
    154.     popad
    155.     mov eax, STATUS_DEVICE_CONFIGURATION_ERROR
    156.     ret
    157.    
    158. DriverEntry ENDP
    159.  
    160.  
    161. END DriverEntry
    162.  
    163. :make
    164. \masm32\bin\ml.exe /c /coff xxxxx.bat
    165. \masm32\bin\link.exe /driver /base:0x10000 /align:32 /out:xxxxx.sys /subsystem:native xxxxx.obj
    166. pause
    В отладчике работает, в нормальных условиях нет - не работает задержка KeDelayExecutionThread. Подскажите, в чём дело?
     
  6. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    прочитай про KeDelayExecutionThread в DDK или на osr. У тебя не правильный формат интервала.
     
  7. AssemblerIA64

    AssemblerIA64 New Member

    Публикаций:
    0
    Регистрация:
    7 окт 2007
    Сообщения:
    160
    n0name, благодарю.
    Странно вообще, что интервал - число отрицательное. Когда читал про KeDelayExecutionThread даже не обратил внимания.
    Вот окончательный вариант:
    Код (Text):
    1. ;@echo off
    2. ;goto make
    3.  
    4. .586p
    5. .MODEL flat, stdcall
    6. option casemap: none
    7.  
    8. include \masm32\include\w2k\ntstatus.inc
    9. include \masm32\include\w2k\ntddk.inc
    10. include \masm32\include\w2k\ntoskrnl.inc
    11.  
    12. includelib wdm.lib
    13.  
    14. TIMER_FREQUENCY = 1193167
    15.  
    16. c1  EQU 130
    17. d1  EQU 147
    18. e1  EQU 165
    19. f1  EQU 175
    20. g1  EQU 197
    21. a1  EQU 220
    22. b1  EQU 247
    23.  
    24. c2  EQU 262
    25. d2  EQU 294
    26. e2  EQU 330
    27.  
    28. MakeBeepX MACRO  tone, duration
    29.     cli
    30.     mov al, 0B6h
    31.     out 43h, al
    32.  
    33.     mov eax, (TIMER_FREQUENCY / tone)
    34.     out 42h, al
    35.     mov al, ah
    36.     out 42h, al
    37.  
    38.     in  al, 61h
    39.     or  al, 3
    40.     out 61h, al
    41.     sti
    42.    
    43.     mov DWORD PTR [esi], -10000*duration
    44.     invoke KeDelayExecutionThread, KernelMode, FALSE, esi
    45.    
    46.     cli
    47.     in  al, 61h
    48.     and al, 0FCh
    49.     out 61h, al
    50.     sti
    51. ENDM
    52.  
    53. .data
    54.     DelayTime   DD  ?
    55.             DD  ?
    56. .code
    57. DriverEntry PROC pDriverObject: PDRIVER_OBJECT, pusRegistryPath: PUNICODE_STRING
    58.     pushad 
    59.     mov esi, OFFSET DelayTime
    60.     mov DWORD PTR [esi+4], -1
    61.    
    62.     MakeBeepX g1, 250
    63.     MakeBeepX c2, 750
    64.     MakeBeepX g1, 500
    65.     MakeBeepX a1, 250
    66.     MakeBeepX b1, 750
    67.     MakeBeepX e1, 500
    68.     MakeBeepX c1, 250
    69.     MakeBeepX a1, 750
    70.     MakeBeepX g1, 500
    71.     MakeBeepX f1, 250
    72.     MakeBeepX g1, 750
    73.     MakeBeepX c1, 500
    74.    
    75.     mov DWORD PTR [esi], -50*10000
    76.     invoke KeDelayExecutionThread, KernelMode, FALSE, esi
    77.    
    78.     MakeBeepX c1, 375
    79.     MakeBeepX d1, 750
    80.     MakeBeepX d1, 375
    81.     MakeBeepX c1, 375
    82.     MakeBeepX f1, 750
    83.     MakeBeepX f1, 375
    84.     MakeBeepX g1, 375
    85.     MakeBeepX a1, 750
    86.     MakeBeepX b1, 375
    87.     MakeBeepX c2, 375
    88.     MakeBeepX d2, 1000
    89.    
    90.     popad
    91.     mov eax, STATUS_DEVICE_CONFIGURATION_ERROR
    92.     ret
    93.    
    94. DriverEntry ENDP
    95.  
    96.  
    97. END DriverEntry
    98.  
    99. :make
    100. \masm32\bin\ml.exe /c /coff xxxxx.bat
    101. \masm32\bin\link.exe /driver /base:0x10000 /align:32 /out:xxxxx.sys /subsystem:native xxxxx.obj
    102. pause