Объясните причину вызникновения ошибки при вызове StartService

Тема в разделе "WASM.BEGINNERS", создана пользователем Xerx, 8 апр 2007.

  1. Xerx

    Xerx Алексей

    Публикаций:
    0
    Регистрация:
    17 фев 2005
    Сообщения:
    528
    Адрес:
    Russia
    Изучаю написание драйверов. Не могу разобраться с запуском драйвера. Вызов StartService() в коде ниже приводит к ошибке ERROR_INVALID_PARAMETER. Вообще не понимаю в чем дело, почему эта ошибка возникает! Помогите разобраться с этой ошибкой. Если нужна еще какая-либо информация - пишите.
    (OpenService само собой отрабатывает корректно)

    Код (Text):
    1. StartService proc
    2. LOCAL   ofn         : OPENFILENAME
    3. LOCAL   _ss         : SERVICE_STATUS
    4. LOCAL   status          : DWORD
    5. LOCAL   Letter[4]       : BYTE
    6. LOCAL   dwBytesReturned     : DWORD
    7. LOCAL   hDevice         : HWND
    8. LOCAL   hSCManager      : HWND
    9. LOCAL   hService        : HWND
    10. LOCAL   hHeap           : HWND
    11. LOCAL   pMemory         : PVOID
    12. LOCAL   lpServiceArgVectors : PVOID
    13.  
    14. mov status,     FALSE
    15. mov     hDevice,    NULL
    16. mov     hSCManager, NULL
    17. mov     hService,   NULL
    18. mov     hHeap,      NULL
    19. mov     pMemory,    NULL
    20.  
    21. ; в BufFileName заносится путь к некоему файлу (какому - роли не играет)
    22.  
    23. ; Выделение ресурсов
    24. invoke  HeapCreate, HEAP_NO_SERIALIZE, 1024, 1024
    25. .if (eax == NULL)
    26.     invoke  AC_ErrorMessage, $invoke(GetLastError)
    27.     jmp ACSS_error
    28. .endif
    29. mov hHeap, eax
    30.  
    31. invoke  HeapAlloc, eax, HEAP_ZERO_MEMORY, 1024
    32. .if (eax == NULL)
    33.     invoke  AC_ErrorMessage, $invoke(GetLastError)
    34.     invoke  HeapDestroy, hHeap
    35.     jmp ACSS_error
    36. .endif
    37. mov pMemory, eax
    38.  
    39. invoke  lstrcpyW, pMemory, $CTW0("\\??\\")
    40. invoke  lstrlen, addr BufFileName
    41. mov edx, pMemory
    42. add edx, 4*2
    43. invoke  MultiByteToWideChar, CP_ACP, 0, addr BufFileName, eax, edx, MAXSIZE
    44.  
    45. invoke  OpenSCManager, NULL, NULL, SC_MANAGER_ALL_ACCESS
    46. .if (eax != NULL)
    47.     mov     hSCManager, eax
    48. .else
    49.     invoke  AC_ErrorMessage, $invoke(GetLastError)
    50.     jmp     ACSS_error
    51. .endif
    52.  
    53. invoke  OpenService, hSCManager, addr SERVICE_NAME, SERVICE_ALL_ACCESS
    54. .if (eax != NULL)      
    55.     mov     hService, eax
    56.     mov     lpServiceArgVectors, 0
    57.    
    58.     ; вызов StartService() приводит к GetLastError() = ERROR_INVALID_PARAMETER (00000057)
    59.    
    60.     invoke  StartService, hService, 0, addr lpServiceArgVectors
    61.     .if (eax != TRUE)
    62.         invoke  AC_ErrorMessage, $invoke(GetLastError)
    63.         jmp ACSS_error
    64.     .endif
    65. .else
    66.     invoke  AC_ErrorMessage, $invoke(GetLastError)
    67.     jmp ACSS_error
    68. .endif
    69.  
    70. ; дальнейший код не важен ...
    Очень надеюсь на вашу помошь! Заранее спасибо.
     
  2. rain

    rain New Member

    Публикаций:
    0
    Регистрация:
    22 апр 2006
    Сообщения:
    976
    Код (Text):
    1. invoke  StartService, hService, 0, addr lpServiceArgVectors
    последний параметр обнули ато получается ты передаешь адрес в котором сразу нули

    работающий сорец запускает по drag'n'drop или переданный в качестве агрумента коммандной строки дров:
    Код (Text):
    1. .386
    2. .model flat, stdcall
    3. option casemap: none
    4.  
    5. include windows.inc
    6.  
    7. include kernel32.inc
    8. includelib kernel32.lib
    9.  
    10. include advapi32.inc
    11. includelib advapi32.lib
    12.  
    13.  
    14. .code
    15. start proc
    16. LOCAL pszFile: DWORD
    17. LOCAL szPath[MAX_PATH]: DWORD
    18.  
    19.     invoke GetCommandLine
    20.     mov edi, eax
    21.     mov ecx, MAX_PATH
    22.        
    23.     .if byte ptr [edi] == '"'
    24.         mov al, '"'
    25.     .else
    26.         mov al, ' '
    27.     .endif
    28.  
    29.     inc edi
    30.     repne scasb
    31.  
    32.    
    33.     mov al, ' '
    34.     repe scasb
    35.     dec edi
    36.    
    37.     .if  byte ptr [edi] == 0
    38.         ret
    39.     .endif  
    40.    
    41.     invoke GetFullPathName, edi, MAX_PATH, addr szPath, addr pszFile
    42.     .if !eax
    43.         ret
    44.     .endif
    45.    
    46.     invoke OpenSCManager, 0, 0, SC_MANAGER_CREATE_SERVICE
    47.     .if !eax
    48.         ret
    49.     .endif
    50.     mov esi, eax
    51.    
    52.     invoke CreateService, esi, pszFile, pszFile, SERVICE_START + DELETE, SERVICE_KERNEL_DRIVER,\
    53.          SERVICE_DEMAND_START, SERVICE_ERROR_NORMAL, addr szPath, 0,0,0,0,0
    54.     .if !eax
    55.         ret
    56.     .endif
    57.     mov edi, eax
    58.        
    59.     invoke StartService, edi, 0, 0
    60.    
    61.     invoke DeleteService, edi
    62.     invoke CloseServiceHandle, edi
    63.     invoke CloseServiceHandle, esi  
    64.    
    65.     ret
    66. start endp
    67. end start
     
  3. Xerx

    Xerx Алексей

    Публикаций:
    0
    Регистрация:
    17 фев 2005
    Сообщения:
    528
    Адрес:
    Russia
    rain> последний параметр обнули ато получается ты передаешь адрес в котором сразу нули
    Я пробовал так. Все по прежнему :dntknw:

    Посмотрел пример. Ничего особенного в нем не нашел. Ниже приведу полный кусок от момента регистрации сервиса, и до места ошибки:
    Код (Text):
    1. ....
    2. invoke  AC_RegisterService
    3. invoke  AC_StartService
    4. ....
    5.  
    6. AC_RegisterService proc
    7. LOCAL   hSCManager  :HWND
    8. LOCAL   status      :DWORD
    9.  
    10.     mov     status, FALSE
    11.     invoke  OpenSCManager, NULL, NULL, SC_MANAGER_ALL_ACCESS
    12.     .if (eax != NULL)
    13.         mov     hSCManager, eax
    14.         invoke  CreateService,  hSCManager, addr SERVICE_NAME, addr SERVICE_CAPTION, SERVICE_ALL_ACCESS,\
    15.                                 SERVICE_KERNEL_DRIVER, SERVICE_DEMAND_START, SERVICE_ERROR_IGNORE,\ ; SERVICE_ERROR_NORMAL
    16.                                 addr DRIVER_FILENAME, NULL, NULL, NULL, NULL, NULL
    17.        
    18.         .if (eax != NULL)
    19.             invoke  CloseServiceHandle, eax
    20.             mov status, TRUE
    21.         .else
    22.             mov status, FALSE
    23.             invoke  AC_ErrorMessage, $invoke(GetLastError)
    24.         .endif
    25.        
    26.         invoke  CloseServiceHandle, hSCManager
    27.     .endif
    28.  
    29.     mov     eax, status
    30.     ret
    31. AC_RegisterService endp
    32.  
    33. C_StartService proc
    34. LOCAL   ofn                 : OPENFILENAME
    35. LOCAL   _ss                 : SERVICE_STATUS
    36. LOCAL   status              : DWORD
    37. LOCAL   Letter[4]           : BYTE
    38. LOCAL   dwBytesReturned     : DWORD
    39. LOCAL   hDevice             : HWND
    40. LOCAL   hSCManager          : HWND
    41. LOCAL   hService            : HWND
    42. LOCAL   hHeap               : HWND
    43. LOCAL   pMemory             : PVOID
    44.  
    45. ; Инициализация пересенных
    46.     mov     status,     FALSE
    47.     mov     hDevice,    NULL
    48.     mov     hSCManager, NULL
    49.     mov     hService,   NULL
    50.     mov     hHeap,      NULL
    51.     mov     pMemory,    NULL
    52.    
    53. ; Загрузка файла-образа
    54.     invoke  RtlZeroMemory, addr ofn, sizeof OPENFILENAME
    55.     invoke  RtlZeroMemory, addr BufFileName, MAXSIZE
    56.    
    57.     mov     ofn.lStructSize,    sizeof OPENFILENAME
    58.     m2m     ofn.hwndOwner,      hMainWnd
    59.     m2m     ofn.hInstance,      hInstance
    60.     mov     ofn.lpstrFilter,    offset OPEN_IMG_FILTER
    61.     mov     ofn.lpstrFile,      offset BufFileName
    62.     mov     ofn.nMaxFile,       MAXSIZE
    63.     mov     ofn.Flags,          OFN_FILEMUSTEXIST or OFN_PATHMUSTEXIST or OFN_LONGNAMES or \
    64.                                 OFN_EXPLORER or OFN_HIDEREADONLY
    65.                                
    66.     invoke  GetOpenFileName, addr ofn
    67.     or      eax,    eax
    68.     jz      ACSS_exit
    69.    
    70. ; Выделение ресурсов
    71.     invoke  HeapCreate, HEAP_NO_SERIALIZE, 1024, 1024
    72.     .if (eax == NULL)
    73.         invoke  AC_ErrorMessage, $invoke(GetLastError)
    74.         jmp ACSS_error
    75.     .endif
    76.     mov     hHeap, eax
    77.     invoke  HeapAlloc, eax, HEAP_ZERO_MEMORY, 1024
    78.     .if (eax == NULL)
    79.         invoke  AC_ErrorMessage, $invoke(GetLastError)
    80.         invoke  HeapDestroy, hHeap
    81.         jmp ACSS_error
    82.     .endif
    83.     mov     pMemory, eax
    84.    
    85.     invoke  lstrcpyW, pMemory, $CTW0("\\??\\")
    86.     invoke  lstrlen, addr BufFileName
    87.     mov     edx, pMemory
    88.     add     edx, 4*2
    89.     invoke  MultiByteToWideChar, CP_ACP, 0, addr BufFileName, eax, edx, MAXSIZE
    90.    
    91.     invoke  OpenSCManager, NULL, NULL, SC_MANAGER_ALL_ACCESS
    92.     .if (eax != NULL)
    93.         mov     hSCManager, eax
    94.     .else
    95.         invoke  AC_ErrorMessage, $invoke(GetLastError)
    96.         jmp     ACSS_error
    97.     .endif
    98.    
    99.     invoke  OpenService, hSCManager, addr SERVICE_NAME, SERVICE_ALL_ACCESS
    100.     .if (eax != NULL)      
    101.         mov     hService, eax
    102.         invoke  StartService, hService, 0, 0
    103.         .if (eax != TRUE)
    104.             invoke  AC_ErrorMessage, $invoke(GetLastError)
    105.             jmp ACSS_error
    106.         .endif
    107.     .else
    108.         invoke  AC_ErrorMessage, $invoke(GetLastError)
    109.         jmp ACSS_error
    110.     .endif
    111. .............
    За основу был взят CrDisk сделанный SteelRat'ом. Я уже чуть-ли не посимвольно сравниваю код, искал в интернете, переписывал код по-другому - без толку! Я готов выложить весь проект полностью, если понадобится.
     
  4. rain

    rain New Member

    Публикаций:
    0
    Регистрация:
    22 апр 2006
    Сообщения:
    976
    весь проэкт не нада только этот файл который стартует сервис
     
  5. Xerx

    Xerx Алексей

    Публикаций:
    0
    Регистрация:
    17 фев 2005
    Сообщения:
    528
    Адрес:
    Russia
    Вот полный код модуля. Ничего не менял. Местами сделано ужасно (жесткое задание буквы диска, размера образа и т.д.), но он только для изучения принципов!
    Код (Text):
    1. .const
    2.     SERVICE_NAME    db 'MyTempService',0
    3.     SERVICE_CAPTION db 'My Temporary Service',0
    4.     DRIVER_FILENAME db 'System32\mytmpsrv.sys',0
    5.     DOS_DEVICE_NAME db '\\Device\\MyTempService',0
    6.    
    7.     IOCTL_UNMOUNT_DISK  equ CTL_CODE(FILE_DEVICE_UNKNOWN, 1, METHOD_BUFFERED, FILE_ANY_ACCESS)
    8.     IOCTL_MOUNT_DISK    equ CTL_CODE(FILE_DEVICE_UNKNOWN, 2, METHOD_BUFFERED, FILE_ANY_ACCESS)
    9.     IOCTL_SET_KEY_DISK  equ CTL_CODE(FILE_DEVICE_UNKNOWN, 3, METHOD_BUFFERED, FILE_ANY_ACCESS)
    10.  
    11.    
    12.     OPEN_IMG_FILTER db 'Файл образа диска (*.ACVH)', 0, '*.acvh', 0
    13.                     db 'Все файлы (*.*)', 0, '*.*', 0, 0
    14.    
    15.     MAXSIZE         equ 1024
    16.    
    17. .data?
    18.     BufFileName     db MAXSIZE dup (?)
    19.     DiskLetter      db 'N:',0
    20.     DiskName        db '\\.\N:',0,0
    21.  
    22. .data
    23.     bDriverInMem    dd  0 ; загружен ли драйвер?
    24.  
    25. .code
    26.  
    27.     ; определение загружен ли драйвер в память
    28.     ; возвращает: 0 - драйвер не найден
    29.     ;               1 - найден, но не загружен
    30.     ;               2 - найден и загружен
    31. AC_FindDriverInMem proto
    32.     ; вывод системной информации о произошедшей ошибке
    33. AC_ErrorMessage proto error:DWORD
    34.     ; регистрация сервиса в SCManager
    35.     ; возвращает TRUE - запуск успешен, иначе FALSE
    36. AC_RegisterService proto
    37.     ; удаление сервиса из SCManager
    38. AC_DeleteService proto
    39.     ; создание нового диска в системе, загрузка файла-образа и запуск сервиса
    40. AC_StartService proto
    41.     ; остановка сервиса, закрытие файла-образа и удаление диска из системы
    42. AC_StopService proto
    43.     ; создание нового файла-образа
    44. AC_CreateNewImage proto
    45. ;   ; надежное удаление файла-образа (с затиранием файла)
    46. ;AC_DeleteImage proto
    47.  
    48. AC_FindDriverInMem proc
    49. LOCAL   _ss         :SERVICE_STATUS
    50. LOCAL   hSCManager  :HWND
    51. LOCAL   hService    :HWND
    52. LOCAL   status      :DWORD
    53.  
    54.     mov     status,         0
    55.     mov     bDriverInMem,   FALSE
    56.  
    57.     invoke  OpenSCManager, NULL, NULL, SC_MANAGER_CONNECT
    58.     .if (eax != NULL)
    59.         mov     hSCManager, eax
    60.         invoke  OpenService, eax, addr SERVICE_NAME, SERVICE_QUERY_STATUS
    61.         .if (eax != NULL)
    62.             mov     hService, eax
    63.             invoke  RtlZeroMemory, addr _ss, sizeof _ss
    64.             invoke  QueryServiceStatus, hService, addr _ss
    65.            
    66.             .if (_ss.dwCurrentState==SERVICE_RUNNING)
    67.                 mov status,         2
    68.                 mov bDriverInMem,   TRUE
    69.             .elseif (_ss.dwCurrentState==SERVICE_STOPPED)
    70.                 mov status,         1
    71.                 mov bDriverInMem,   TRUE
    72.             .else
    73.                 invoke MessageBox,  hMainWnd, SADD("Системная ошибка! Необходим перезапуск системы."),
    74.                                     addr APPLICATION_NAME, MB_OK
    75. ;               mov status, 0
    76.             .endif
    77.            
    78.             invoke CloseServiceHandle, hService
    79.         .endif
    80.         invoke CloseServiceHandle, hSCManager
    81.     .endif
    82.    
    83.     mov eax, status
    84.     ret
    85. AC_FindDriverInMem endp
    86.  
    87. AC_ErrorMessage proc error:DWORD
    88. LOCAL   buffer  : DWORD
    89. ; может внести внешний GetLastError() внутрь?
    90.  
    91.     invoke  FormatMessage,  FORMAT_MESSAGE_ALLOCATE_BUFFER or FORMAT_MESSAGE_FROM_SYSTEM, \
    92.                             NULL, error, 0, addr buffer, 0, 0
    93.     invoke  MessageBox, NULL, buffer, addr APPLICATION_NAME, MB_OK
    94.     invoke  LocalFree, buffer
    95.  
    96.     ret
    97. AC_ErrorMessage endp
    98.  
    99. AC_RegisterService proc
    100. LOCAL   hSCManager  :HWND
    101. LOCAL   status      :DWORD
    102.  
    103.     mov     status, FALSE
    104.     invoke  OpenSCManager, NULL, NULL, SC_MANAGER_ALL_ACCESS
    105.     .if (eax != NULL)
    106.         mov     hSCManager, eax
    107.         invoke  CreateService,  hSCManager, addr SERVICE_NAME, addr SERVICE_CAPTION, SERVICE_ALL_ACCESS,\
    108.                                 SERVICE_KERNEL_DRIVER, SERVICE_DEMAND_START, SERVICE_ERROR_IGNORE,\ ; SERVICE_ERROR_NORMAL
    109.                                 addr DRIVER_FILENAME, NULL, NULL, NULL, NULL, NULL
    110.        
    111.         .if (eax != NULL)
    112.             invoke  CloseServiceHandle, eax
    113.             mov status, TRUE
    114.         .else
    115.             mov status, FALSE
    116.             invoke  AC_ErrorMessage, $invoke(GetLastError)
    117.         .endif
    118.        
    119.         invoke  CloseServiceHandle, hSCManager
    120.     .endif
    121.  
    122.     mov     eax, status
    123.     ret
    124. AC_RegisterService endp
    125.  
    126. AC_DeleteService proc
    127. LOCAL   hSCManager  :HWND
    128. LOCAL   hService    :HWND
    129.  
    130.     invoke  OpenSCManager, NULL, NULL, SC_MANAGER_ALL_ACCESS
    131.     .if (eax != NULL)
    132.         mov     hSCManager, eax
    133.         invoke  OpenService, hSCManager, addr SERVICE_NAME, SC_MANAGER_ALL_ACCESS
    134.         mov     hService, eax
    135.         or      eax, eax
    136.         jz      srvDeleteError
    137.         invoke  DeleteService, eax
    138.         or      eax, eax
    139.         jz      srvDeleteError
    140.     .else
    141. srvDeleteError:
    142.         invoke  AC_ErrorMessage, $invoke(GetLastError)
    143.     .endif
    144.    
    145.     invoke CloseServiceHandle, hService
    146.     invoke CloseServiceHandle, hSCManager
    147.    
    148.     ret
    149. AC_DeleteService endp
    150.  
    151. AC_StartService proc
    152. LOCAL   ofn                 : OPENFILENAME
    153. LOCAL   _ss                 : SERVICE_STATUS
    154. LOCAL   status              : DWORD
    155. LOCAL   Letter[4]           : BYTE
    156. LOCAL   dwBytesReturned     : DWORD
    157. LOCAL   hDevice             : HWND
    158. LOCAL   hSCManager          : HWND
    159. LOCAL   hService            : HWND
    160. LOCAL   hHeap               : HWND
    161. LOCAL   pMemory             : PVOID
    162.  
    163. ; Инициализация пересенных
    164.     mov     status,     FALSE
    165.     mov     hDevice,    NULL
    166.     mov     hSCManager, NULL
    167.     mov     hService,   NULL
    168.     mov     hHeap,      NULL
    169.     mov     pMemory,    NULL
    170.    
    171. ; Загрузка файла-образа
    172.     invoke  RtlZeroMemory, addr ofn, sizeof OPENFILENAME
    173.     invoke  RtlZeroMemory, addr BufFileName, MAXSIZE
    174.    
    175.     mov     ofn.lStructSize,    sizeof OPENFILENAME
    176.     m2m     ofn.hwndOwner,      hMainWnd
    177.     m2m     ofn.hInstance,      hInstance
    178.     mov     ofn.lpstrFilter,    offset OPEN_IMG_FILTER
    179.     mov     ofn.lpstrFile,      offset BufFileName
    180.     mov     ofn.nMaxFile,       MAXSIZE
    181.     mov     ofn.Flags,          OFN_FILEMUSTEXIST or OFN_PATHMUSTEXIST or OFN_LONGNAMES or \
    182.                                 OFN_EXPLORER or OFN_HIDEREADONLY
    183.                                
    184.     invoke  GetOpenFileName, addr ofn
    185.     or      eax,    eax
    186.     jz      ACSS_exit
    187.    
    188. ; Выделение ресурсов
    189.     invoke  HeapCreate, HEAP_NO_SERIALIZE, 1024, 1024
    190.     .if (eax == NULL)
    191.         invoke  AC_ErrorMessage, $invoke(GetLastError)
    192.         jmp ACSS_error
    193.     .endif
    194.     mov     hHeap, eax
    195.     invoke  HeapAlloc, eax, HEAP_ZERO_MEMORY, 1024
    196.     .if (eax == NULL)
    197.         invoke  AC_ErrorMessage, $invoke(GetLastError)
    198.         invoke  HeapDestroy, hHeap
    199.         jmp ACSS_error
    200.     .endif
    201.     mov     pMemory, eax
    202.    
    203.     invoke  lstrcpyW, pMemory, $CTW0("\\??\\")
    204.     invoke  lstrlen, addr BufFileName
    205.     mov     edx, pMemory
    206.     add     edx, 4*2
    207.     invoke  MultiByteToWideChar, CP_ACP, 0, addr BufFileName, eax, edx, MAXSIZE
    208.    
    209.     invoke  OpenSCManager, NULL, NULL, SC_MANAGER_ALL_ACCESS
    210.     .if (eax != NULL)
    211.         mov     hSCManager, eax
    212.     .else
    213.         invoke  AC_ErrorMessage, $invoke(GetLastError)
    214.         jmp     ACSS_error
    215.     .endif
    216.    
    217.     invoke  MessageBox, hMainWnd, SADD('_1_'), 0, 0
    218.    
    219.     invoke  OpenService, hSCManager, addr SERVICE_NAME, SERVICE_ALL_ACCESS
    220.     .if (eax != NULL)      
    221.         mov     hService, eax
    222.         invoke  StartService, hService, 0, 0
    223.         .if (eax != TRUE)
    224.             invoke  AC_ErrorMessage, $invoke(GetLastError)
    225.             jmp ACSS_error
    226.         .endif
    227.     .else
    228.         invoke  AC_ErrorMessage, $invoke(GetLastError)
    229.         jmp ACSS_error
    230.     .endif
    231.    
    232.     invoke  MessageBox, hMainWnd, SADD('_2_'), 0, 0
    233.    
    234. ; Сервис стартовал
    235. ;   invoke  SendDlgItemMessage, hMainWnd, IDC_CBO_DISK, WM_GETTEXT, 2, offset DiskName+4
    236. ;   mov     byte ptr DiskName+5, ':'
    237.     invoke  CreateFile, offset DiskName, GENERIC_READ or GENERIC_WRITE,\
    238.                         FILE_SHARE_READ or FILE_SHARE_WRITE, 0, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0
    239.     .if (eax != INVALID_HANDLE_VALUE)
    240.         ; invoke ErrorMessage, ERROR_INVALID_ACCESS
    241.         jmp ACSS_error
    242.     .endif
    243.    
    244.     invoke  MessageBox, hMainWnd, SADD('_3_'), 0, 0
    245.    
    246.     invoke  DefineDosDevice, DDD_RAW_TARGET_PATH, addr Letter, addr DOS_DEVICE_NAME
    247.     .if (eax==TRUE)
    248.         invoke  CreateFile, offset DiskName, GENERIC_READ or GENERIC_WRITE,\
    249.                             FILE_SHARE_READ or FILE_SHARE_WRITE, 0, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0
    250.         .if (eax != INVALID_HANDLE_VALUE)
    251.             mov     hDevice, eax
    252.            
    253.             invoke  lstrlenW, pMemory
    254.             add     eax, eax
    255.             add     eax, 2
    256.             mov     edx, eax
    257.             invoke  DeviceIoControl, hDevice, IOCTL_MOUNT_DISK, pMemory, edx, NULL, 0, addr dwBytesReturned, 0
    258.             mov     status, eax
    259.             .if eax==0
    260.                 invoke  AC_ErrorMessage, $invoke(GetLastError)
    261.                 invoke  DefineDosDevice, DDD_REMOVE_DEFINITION, addr Letter, NULL
    262.                 invoke  ControlService, hService, SERVICE_CONTROL_STOP, addr _ss
    263.             .endif
    264.         .else
    265.             invoke  AC_ErrorMessage, $invoke(GetLastError)
    266.             invoke  DefineDosDevice, DDD_REMOVE_DEFINITION, addr Letter, NULL
    267.             invoke  ControlService, hService, SERVICE_CONTROL_STOP, addr _ss
    268.             jmp ACSS_error
    269.         .endif
    270.     .endif
    271.    
    272.     invoke  MessageBox, hMainWnd, SADD('_4_'), 0, 0
    273.  
    274. ACSS_error:
    275.  
    276.     ; Освобождение памяти
    277.     .if (hDevice != NULL)
    278.         invoke  CloseHandle, hDevice
    279.     .endif
    280.     .if (hService != NULL)
    281.         invoke  CloseServiceHandle, hService
    282.     .endif
    283.     .if (hSCManager != NULL)
    284.         invoke  CloseServiceHandle, hSCManager
    285.     .endif
    286.     .if (hHeap != NULL)
    287.         invoke  RtlZeroMemory, pMemory, 1024
    288.         invoke  HeapFree, hHeap, HEAP_NO_SERIALIZE, pMemory
    289.         invoke  HeapDestroy, hHeap
    290.     .endif 
    291.  
    292. ACSS_exit:
    293.     mov     eax, status
    294.     ret
    295. AC_StartService endp
    296.  
    297. AC_StopService proc
    298. LOCAL   _ss             : SERVICE_STATUS
    299. LOCAL   hDevice         : HWND
    300. LOCAL   status          : DWORD
    301. LOCAL   dwBytesReturned : DWORD
    302. LOCAL   hSCManager      : HWND
    303. LOCAL   hService        : HWND
    304.  
    305.     mov     status, TRUE
    306.    
    307.     invoke  CreateFile, offset DiskName, GENERIC_READ or GENERIC_WRITE, 0, NULL, OPEN_EXISTING, 0, 0
    308.     .if (eax == INVALID_HANDLE_VALUE)
    309.         invoke  AC_ErrorMessage, $invoke(GetLastError)
    310.         jmp     ACSS_error
    311.     .endif
    312.     mov hDevice, eax
    313.    
    314.     invoke  DeviceIoControl, hDevice, FSCTL_LOCK_VOLUME, NULL, 0, NULL, 0, addr dwBytesReturned, NULL
    315.     .if (eax == 0)
    316.         invoke  AC_ErrorMessage, $invoke(GetLastError)
    317.         jmp     ACSS_error
    318.     .endif
    319.    
    320.     invoke  DeviceIoControl, hDevice, IOCTL_UNMOUNT_DISK, NULL, 0, NULL, 0, addr dwBytesReturned, NULL
    321.     .if (eax == 0)
    322.         invoke  AC_ErrorMessage, $invoke(GetLastError)
    323.         jmp     ACSS_error
    324.     .endif
    325.    
    326.     invoke  DeviceIoControl, hDevice, FSCTL_DISMOUNT_VOLUME, NULL, 0, NULL, 0, addr dwBytesReturned, NULL
    327.     .if (eax == 0)
    328.         invoke  AC_ErrorMessage, $invoke(GetLastError)
    329.         jmp     ACSS_error
    330.     .endif
    331.    
    332.     invoke  DeviceIoControl, hDevice, FSCTL_UNLOCK_VOLUME, NULL, 0, NULL, 0, addr dwBytesReturned, NULL
    333.     .if (eax == 0)
    334.         invoke  AC_ErrorMessage, $invoke(GetLastError)
    335.         jmp     ACSS_error
    336.     .endif
    337.    
    338.     invoke  FlushFileBuffers, eax
    339.     invoke  CloseHandle, hDevice
    340.     invoke  DefineDosDevice, DDD_REMOVE_DEFINITION, offset DiskName+4, 0
    341.     .if (eax == 0)
    342.         invoke  AC_ErrorMessage, $invoke(GetLastError)
    343.         jmp     ACSS_error
    344.     .endif
    345.     mov status, FALSE
    346.    
    347.     invoke  OpenSCManager, NULL, NULL, SC_MANAGER_CONNECT
    348.     .if (eax != NULL)
    349.         mov     hSCManager, eax
    350.         invoke  OpenService, hSCManager, addr SERVICE_NAME, SERVICE_STOP
    351.         .if (eax == NULL)
    352.             invoke  AC_ErrorMessage, $invoke(GetLastError)
    353.             jmp     ACSS_error
    354.         .else
    355.             mov     hService, eax
    356.             invoke  RtlZeroMemory, addr _ss, sizeof _ss
    357.             invoke  ControlService, hService, SERVICE_CONTROL_STOP, addr _ss
    358.             .if (eax == 0)
    359.                 invoke  AC_ErrorMessage, $invoke(GetLastError)
    360.             .else
    361.                 mov status, TRUE
    362.             .endif
    363.         .endif
    364.     .else
    365.         invoke  AC_ErrorMessage, $invoke(GetLastError)
    366.         jmp     ACSS_error
    367.     .endif
    368.    
    369. ACSS_error:
    370.     invoke  CloseServiceHandle, hService
    371.     invoke  CloseServiceHandle, hSCManager
    372.     mov     eax, status
    373.    
    374.     ret
    375. AC_StopService endp
    376.  
    377. AC_CreateNewImage proc
    378. LOCAL   status          :DWORD
    379. LOCAL   hFile           :HWND
    380. LOCAL   FileSize        :LONG
    381. LOCAL   BytesWritten    :DWORD
    382. LOCAL   Sector[512]     :BYTE
    383.  
    384.     mov     eax,        1
    385.     clc
    386.     rol     eax,        11
    387.     mov     FileSize,   eax ; число секторов
    388.    
    389.     invoke  lstrcpy, addr BufFileName, SADD('C:\img.acvh')
    390.    
    391.     invoke  CreateFile, addr BufFileName, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL
    392.     mov     hFile, eax
    393.     .if (eax == INVALID_HANDLE_VALUE)
    394.         invoke  AC_ErrorMessage, $invoke(GetLastError)
    395.         jmp     ACCNI_error
    396.     .endif
    397.    
    398.     invoke  RtlZeroMemory, addr Sector, 512
    399.    
    400.     mov     ecx,    FileSize
    401. @@SaveSector:
    402.     push    ecx
    403.     invoke  WriteFile, hFile, addr Sector, 512, addr BytesWritten, NULL
    404.     pop     ecx
    405.     loop    @@SaveSector
    406.    
    407. ACCNI_error:
    408.  
    409.     invoke  CloseHandle, hFile
    410.    
    411.     ret
    412. AC_CreateNewImage endp
    Надеюсь, этот код поможет.
     
  6. rain

    rain New Member

    Публикаций:
    0
    Регистрация:
    22 апр 2006
    Сообщения:
    976
    Xerx
    ужас.. было бы лучше если б весь проэкт..
    для изучения принципов можно почитать KmdTut
    по коду чуть подмарафетил твой код, этот кусок работает номально, значит ошибка в чём-то другом
    Код (Text):
    1. .386
    2. .model flat, stdcall
    3. option casemap: none
    4. include windows.inc
    5. include kernel32.inc
    6. includelib kernel32.lib
    7. include advapi32.inc
    8. includelib advapi32.lib
    9. include comdlg32.inc
    10. includelib comdlg32.lib
    11. include macros.asm
    12. .const
    13.     DRIVER_FILENAME db 'c:\temp\xerx\beeper.sys',0 
    14.     MAXSIZE         equ 1024
    15.    
    16. .data?
    17.     BufFileName     db MAXSIZE dup (?)
    18.  
    19. .data
    20.     bDriverInMem    dd  0 ; загружен ли драйвер?
    21.  
    22. .code
    23.  
    24.  
    25.  
    26. AC_RegisterService proc
    27. LOCAL   hSCManager  :HWND
    28. LOCAL   status      :DWORD
    29.  
    30.     mov     status, FALSE
    31.     invoke  OpenSCManager, NULL, NULL, SC_MANAGER_ALL_ACCESS
    32.     .if (eax != NULL)
    33.         mov     hSCManager, eax
    34.         mov esi, offset DRIVER_FILENAME
    35.        
    36.         invoke  CreateService,  hSCManager, chr$('_beeper'), esi , SERVICE_ALL_ACCESS,\
    37.                                 SERVICE_KERNEL_DRIVER, SERVICE_DEMAND_START, SERVICE_ERROR_IGNORE,\ ; SERVICE_ERROR_NORMAL
    38.                                 esi, NULL, NULL, NULL, NULL, NULL
    39.        
    40.         .if (eax != NULL)
    41.             invoke  CloseServiceHandle, eax
    42.             mov status, TRUE
    43.         .else
    44.             mov status, FALSE
    45. ;           invoke  AC_ErrorMessage, invoke(GetLastError)
    46.         .endif
    47.        
    48.         invoke  CloseServiceHandle, hSCManager
    49.     .endif
    50.  
    51.     mov     eax, status
    52.     ret
    53. AC_RegisterService endp
    54.  
    55.  
    56. AC_StartService proc
    57.  
    58. LOCAL   _ss                 : SERVICE_STATUS
    59. LOCAL   status              : DWORD
    60. LOCAL   Letter[4]           : BYTE
    61. LOCAL   dwBytesReturned     : DWORD
    62. LOCAL   hDevice             : HWND
    63. LOCAL   hSCManager          : HWND
    64. LOCAL   hService            : HWND
    65. LOCAL   hHeap               : HWND
    66. LOCAL   pMemory             : PVOID
    67.  
    68. ; Инициализация пересенных
    69.     mov     status,     FALSE
    70.     mov     hDevice,    NULL
    71.     mov     hSCManager, NULL
    72.     mov     hService,   NULL
    73.     mov     hHeap,      NULL
    74.     mov     pMemory,    NULL
    75.    
    76.    
    77.     invoke  OpenSCManager, NULL, NULL, SC_MANAGER_ALL_ACCESS
    78.     .if (eax != NULL)
    79.         mov     hSCManager, eax
    80.     .else
    81. ;       invoke  AC_ErrorMessage, invoke(GetLastError)
    82.    
    83.     .endif
    84.    
    85. ;   invoke  MessageBox, hMainWnd, SADD('_1_'), 0, 0
    86.    
    87.     invoke  OpenService, hSCManager, chr$('_beeper'), SERVICE_ALL_ACCESS
    88.     .if (eax != NULL)      
    89.         mov     hService, eax
    90.         invoke  StartService, hService, 0, 0
    91.         .if (eax != TRUE)
    92. ;           invoke  AC_ErrorMessage, invoke(GetLastError)
    93.    
    94.         .endif
    95.     .else
    96. ;       invoke  AC_ErrorMessage, invoke(GetLastError)
    97.    
    98.     .endif
    99.    
    100.     ret
    101. AC_StartService endp
    102. start:
    103.     int 3
    104.     call AC_RegisterService
    105.     call AC_StartService
    106.     ret
    107. end start
     
  7. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    Посмотри мои сорсы: http://forum.antichat.ru/showthread.php?t=36370
     
  8. Xerx

    Xerx Алексей

    Публикаций:
    0
    Регистрация:
    17 фев 2005
    Сообщения:
    528
    Адрес:
    Russia
    rain
    > ужас.. было бы лучше если б весь проэкт..
    А я так вообще-то сразу и предлогал ;)

    > для изучения принципов можно почитать KmdTut
    Уже вдоль и поперек. Даже кучу рабочих похожих примеров нашел - и ВАЩЕ не понимаю в чем дело!!!

    > по коду чуть подмарафетил твой код, этот кусок работает номально, значит ошибка в чём-то другом
    Ну, единственная разница - указан полный, а не относительный путь к драйверу плюс вместо нормальных addr DRIVER_NAME везде проставлены chr$(...). Никакого другого различия я не нашел. И, как и следовало ожидать, код не работает!

    Great
    Так и не смог скачать файл: как ни пытался - не дает, кричит, что я не авторизован и вместо файла выдает форму авторизации. Можешь выложить пример в другом месте?
     
  9. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    Xerx
    http://gr8.cih.ms/uploads/loaddriver.zip
     
  10. rain

    rain New Member

    Публикаций:
    0
    Регистрация:
    22 апр 2006
    Сообщения:
    976
    отож так что ищи траблу в другом месте.. мож ты например хочешь запустить x86 драйвер под x64
    выложи весть проэкт если возможно
     
  11. Xerx

    Xerx Алексей

    Публикаций:
    0
    Регистрация:
    17 фев 2005
    Сообщения:
    528
    Адрес:
    Russia
    rain
    Нашел ошибку. Дело было и правда вообще не в загрузчике, а в самом драйвере :dntknw: При загрузке в DriverEntry происходила обрататываемая ошибка и происходил выход. В итоге драйвер не грузился. Почему мне в данном случае приходило сообщение ERROR_INVALID_PARAMETER не знаю. Главное что рабобрался.

    Но тут проблема дальше: при создании нового диска DefineDosDevice и открытием диска через CreateFile выдается ошибка ERROR_INVALID_NAME (Синтаксическая ошибка в имени файла, имени папки или метке тома). Имя тома:
    . Перед этим диск был создан:
    . Вызов вернул 1 (как я понял, функция отработала корректно).
    Получается, происходит ошибка при попытке создания диска. А почему? Не загрузился сам драйвер, драйвер как-то коряво работает, неправильно пытаюсь создать диск, или еще что?

    Смотрел в WinObjEx. В момент появления сообщения об ошибке драйвер в памяти висит и работает. В DosDevice диск L: прописан на мой драйвер \\Device\\TinyDriver.

    В общем, я решил выложить весь проект полностью (WinRAR, 20Кб). Корявый, примитивный - это да. Но я хочу понять почему этот примитивизм не работает! проект на RadASM/MASM. Со всеми ресурсами и файлами.
    Проблемное место: DriverService.inc строки 235...259.

    Что-то не добавляется файл. Может я не так делаю, но после указания пути к файлу и перехода я получаю измененй пост БЕЗ указания на аттач.
    Выкладываю архив на стороннем сайте: http://xerxde.narod.ru/tinydriver.rar
     
  12. Xerx

    Xerx Алексей

    Публикаций:
    0
    Регистрация:
    17 фев 2005
    Сообщения:
    528
    Адрес:
    Russia
    Great
    Скачал, буду разбираться. Спасибо.
    P.S. Если что надумаю - напишу в этой ветке.
     
  13. nitrotoluol

    nitrotoluol New Member

    Публикаций:
    0
    Регистрация:
    5 сен 2006
    Сообщения:
    848
    Xerx
    Финт в том, что StartService сводится к ZwLoadDriver, который возвращает значение, переданное ему при выходе из DriverEntry самого драйвера(т.е. просто считывается еах сразу после выхода из процедуры инициализации и передается как выходное значение функции ZwLoadDriver, вызванной из проги загрузки).

    Проще говоря, когда я разбирался с дровами, мой драйвер возвращал при выходе из DriverEntry 12345678h
    И если после старта сервиса код 12345678h - то я знал, что инициализация драйвера успешна. В противном случае инициализации не было. Отсюда и такого геморра как у тебя тоже не было. Всегда знаю, где ошибка.

    Теперь по поводу загрузки.
    Ну кто тебя так учил дрова грузить...? ;) Ты же не дельфин все-таки.
    Есть способы проще. В раза 4. И не создают мусора.

    Вот код.
    Код (Text):
    1. SetupDriver proc
    2. LOCAL DrvImage[300]:BYTE
    3. LOCAL hKey1,hKey2:DWORD
    4.  
    5.     mov dword ptr [DrvImage], "\??\"
    6.     lea eax, [DrvImage+4]
    7.     lea edx, [eax+296]
    8.     invoke GetFullPathName,offset DrvFile, 400h, eax, edx
    9.     invoke RegOpenKeyA, HKEY_LOCAL_MACHINE, offset [KeyNm1], offset [hKey1]
    10.     invoke RegCreateKeyA, dword ptr [hKey1], offset [KeyNm2], offset [hKey2]
    11.     lea eax, [DrvImage]
    12.     invoke lstrlenA, eax
    13.     lea esi, [DrvImage]
    14.     invoke RegSetValueExA(dword ptr [hKey2], offset [lpPr1], 0, REG_SZ, esi, eax);
    15.     invoke RegSetValueExA(dword ptr [hKey2], offset [lpPr2], 0, REG_DWORD, offset [dValue1], 4);
    16.     invoke RegCloseKey, [hKey2]
    17.     invoke RegCloseKey, [hKey1]
    18.     invoke  RtlInitUnicodeString, offset [DrvImage], offset [DrvReg]
    19.     lea eax, [DrvImage]
    20.     invoke  ZwLoadDriver, offset [DrvImage],
    21.     ret
    22.  
    23. DrvReg  db "\registry\machine\system\CurrentControlSet\Services\XDriver",0
    24. DrvFile db "XDriver.sys",0
    25. KeyNm1  db "system\CurrentControlSet\Services",0
    26. KeyNm2  db "XDriver",0
    27. lpPr1   db "ImagePath",0
    28. lpPr2   db "Type",0
    29.  
    30. SetupDriver endp
    Взято из статьи Ms-Rema и переиначено на асм.
    Статья "Перехват АПИ функций в Windows NT - часть 3"
    Есть тут, на сайте
     
  14. nitrotoluol

    nitrotoluol New Member

    Публикаций:
    0
    Регистрация:
    5 сен 2006
    Сообщения:
    848
    Код (Text):
    1. Но тут проблема дальше: при создании нового диска DefineDosDevice и открытием диска через CreateFile выдается ошибка ERROR_INVALID_NAME (Синтаксическая ошибка в имени файла, имени папки или метке тома). Имя тома:
    А разве CreateFile при создании диска не передаешь прямо нультерменированные
    "L:" или "L:\" (точно не понмю) ??
    Вроде в остальных случаях пишет, что функция провалена....
     
  15. wasm_test

    wasm_test wasm test user

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

    Xerx Алексей

    Публикаций:
    0
    Регистрация:
    17 фев 2005
    Сообщения:
    528
    Адрес:
    Russia
    nitrotoluol
    >
    А я учился по примерам KmdKit/KmdTut, ОЧЕНЬ высоко ценящимся в инете. Там именно так и реализовано. Так что дельфином можно и Four-F назвать?
     
  17. Xerx

    Xerx Алексей

    Публикаций:
    0
    Регистрация:
    17 фев 2005
    Сообщения:
    528
    Адрес:
    Russia
    Great
    да ну, имхо, лучше юзать нормальные апишки, чем это недокументированное нечто, которое, кстати, у меня иногда зависает (хз почему). а при работе с сервисами все ок. Плюс примеры Four-F.

    А в статье "Перехват АПИ функций в Windows NT - часть 3" такой текст:
    И кому верить. Какой способ в моем случае лучше?
     
  18. Xerx

    Xerx Алексей

    Публикаций:
    0
    Регистрация:
    17 фев 2005
    Сообщения:
    528
    Адрес:
    Russia
    nitrotoluol
    Да никак не работает! У меня складывается впечатление, что дело вообще в самом драйвере. ЧТо-то в нем не работает... Вопрос что?
     
  19. nitrotoluol

    nitrotoluol New Member

    Публикаций:
    0
    Регистрация:
    5 сен 2006
    Сообщения:
    848
    Xerx
    Four-F несомненно гуру, и вопрос не в том КТО КРУЧЕ. Но цели, которые ставил перед написанием своих манов
    Four-F несколько отличаются от целей Ms-Remа. Аудитория так же несколько различна. Первый писал маны для программистов в целом, чтобы дать толчок дальнейшему изучению ддк самостоятельно.... так сказать Фоур-Ф донес основы.
    Ms-Rem же писал изначально для людей, чей уровень несколько выше среднего и которым можно доносить прочие способы запуска ...
    Это раз.

    Во вторых.
    Сказанно же, глючный и тормозной первый способ, второй способ более предпочтителен, поскольку весь механизм запуска драйвера для тебя становится прозрачным. Никаких SCM и пр.
    И отлаживать код с ZwLoadDriver проще.

    Great
    А с каких пор ядерные АПИшки стали НЕНОРМАЛЬНЫМИ? Если дизассемблировать ядро, вызов сервиса сводится именно к ZwLoadDriver. Как ни крути, вызов идет полюбому.
    ЗЫ: функция ZwLoadDriver прекрасно докумментированна в DDK.
     
  20. nitrotoluol

    nitrotoluol New Member

    Публикаций:
    0
    Регистрация:
    5 сен 2006
    Сообщения:
    848
    Xerx
    сейчас выпью кофе и погоняю твой код под отладчиком, посмотрим, что там с диском