Создание службы на MASM32

Тема в разделе "WASM.WIN32", создана пользователем Llirik, 4 ноя 2010.

  1. Llirik

    Llirik Member

    Публикаций:
    0
    Регистрация:
    18 июл 2008
    Сообщения:
    471
    Код:
    Код (Text):
    1. .386p
    2. option casemap:none
    3. .model flat, stdcall
    4. includelib C:\masm32\lib\kernel32.lib
    5. includelib  C:\masm32\lib\user32.lib
    6. includelib  C:\masm32\lib\gdi32.lib
    7. includelib  C:\masm32\lib\advapi32.lib
    8. includelib  C:\masm32\lib\dinput.lib
    9. includelib  C:\masm32\lib\dxguid.lib
    10. includelib  C:\masm32\lib\Uuid.Lib
    11. includelib  C:\masm32\lib\oldnames.lib
    12. include C:\masm32\include\Kernel32.inc
    13. include C:\masm32\include\gdi32.inc
    14. include C:\masm32\include\advapi32.inc
    15. include C:\masm32\include\user32.inc
    16.  
    17. extrn DirectInputCreateA@16:near
    18.  
    19. mServiceMain PROTO STDCALL   :DWORD, :DWORD
    20. Handler  PROTO STDCALL   :DWORD
    21. .const
    22.  
    23. SERVICE_CONTROL_SHUTDOWN = 000000005h
    24. SERVICE_WIN32_OWN_PROCESS = 000000010h
    25. SERVICE_RUNNING  = 000000004h
    26. SERVICE_ACCEPT_SHUTDOWN  = 000000004h
    27. NO_ERROR  = 000000000h
    28. .data
    29.  
    30. dwServiceType        dd      ?
    31. dwCurrentState        dd      ?
    32. dwControlsAccepted        dd      ?
    33. dwWin32ExitCode        dd      ?
    34. dwServiceSpecificExitCode    dd      ?
    35. dwCheckPoint        dd      ?
    36. dwWaitHint        dd      ?
    37.  
    38. mServiceTableEntry dd offset mServiceName, offset mServiceMain, 0, 0
    39. diini       dd  ?
    40. hService dd ?
    41.     lpdi        dd      0
    42. ; ServiceStatus SERVICE_STATUS ?
    43.  
    44. mServiceName db "Dinmouse",0
    45. titleprog     db       "Иницилизация мыши",0
    46. msbtxt1      db       "Выполнено успешно",0
    47. dinputerr db   "Ошибка при иницилизации DirectInputCreate",0
    48. msgmouseerr  db   "Ошибка при иницилизации мыши",0
    49. msghandleerr  db   "Ошибка при получении хендла",0
    50. FALSE       equ 0
    51. TRUE        equ 1
    52. .code      
    53. main:  
    54. invoke StartServiceCtrlDispatcher, addr mServiceTableEntry
    55. invoke mServiceMain, 0, 0
    56. mServiceMain proc dwNU1:dword, dwNU2:dword
    57. ;Register service
    58. invoke RegisterServiceCtrlHandler, addr mServiceName, addr Handler
    59. mov hService, eax
    60.  
    61. ; invoke RtlZeroMemory, status, sizeof.SERVICE_STATUS
    62. mov dwServiceType, SERVICE_WIN32_OWN_PROCESS
    63. mov dwCurrentState, SERVICE_RUNNING
    64. mov dwControlsAccepted, SERVICE_ACCEPT_SHUTDOWN
    65. mov dwWin32ExitCode, NO_ERROR
    66.  
    67. invoke SetServiceStatus, hService, addr dwServiceType
    68.  
    69.             push  0
    70.             call    GetModuleHandleA
    71.     cmp    eax,0
    72.     je  errhandle
    73.             mov    diini,eax
    74.     push 0
    75.     push offset lpdi
    76.     push 0500h
    77.     push diini
    78.     call DirectInputCreateA@16
    79.  
    80.     ;=============================
    81.     ; Test for an error creating
    82.     ;=============================
    83.     .if eax != 0
    84.         jmp err
    85.     .endif
    86.  
    87.  
    88.  
    89.  done:
    90.     ;===================
    91.     ; Выполнено успешно
    92.     ;===================
    93.  
    94.             push    0
    95.             push    offset  titleprog
    96.             push  offset  msbtxt1
    97.             push  0
    98.             call MessageBoxA
    99.             ret
    100. err:
    101.  
    102.     ;===================
    103.     ; Вывести сообщение об ошибке
    104.     ;===================
    105.  
    106.             push    0
    107.             push    offset  titleprog
    108.             push  offset  dinputerr
    109.             push    0  
    110.             call MessageBoxA
    111.             jmp  exproc0
    112.  
    113. errhandle:
    114.     ;===================
    115.     ; Вывести сообщение об ошибке
    116.     ;===================
    117.  
    118.             push    0
    119.             push    offset  titleprog
    120.             push  offset  msghandleerr  
    121.             push    0  
    122.             call MessageBoxA
    123. exproc0:
    124. invoke ExitProcess, 0
    125.             ret
    126. mServiceMain endp
    127. Handler proc dwAction:dword
    128. cmp dwAction, SERVICE_CONTROL_SHUTDOWN
    129. jz exproc
    130. ret
    131. exproc:
    132. invoke ExitProcess, 0
    133. ret
    134. Handler endp
    135.  
    136.  end main
    Параметры запуска в реестре:
    ErrorControl (1)
    ImagePath \??\C:\Program Files\Mkkm\Dinmouse.exe
    Start (2)
    Type (16)

    Ошибка: "Не удаётся найти указанный файл"
    Что я сделал не так? Переводил с TASM`а, а читал о создании служб на Делфи
     
  2. _sheva740

    _sheva740 New Member

    Публикаций:
    0
    Регистрация:
    31 авг 2005
    Сообщения:
    1.539
    Адрес:
    Poland
    Llirik
    Могу дать рабочий код на С
    from the book "Win32 System Services: The Heart of Windows NT" by Marshall Brain
    Выложить ? Там все структурно и достаточно популярно.
     
  3. Llirik

    Llirik Member

    Публикаций:
    0
    Регистрация:
    18 июл 2008
    Сообщения:
    471
    Нет. Благодарю. Языка С я не знаю и английского тоже
     
  4. _sheva740

    _sheva740 New Member

    Публикаций:
    0
    Регистрация:
    31 авг 2005
    Сообщения:
    1.539
    Адрес:
    Poland
    Ну тогда задай в гугле запрос типа - "invoke RegisterServiceCtrlHandler".
    Найдешь массу рабочих примеров, зуб даю :)
     
  5. diogen

    diogen New Member

    Публикаций:
    0
    Регистрация:
    26 сен 2004
    Сообщения:
    26
    _sheva740
    Выложи "Win32 System Services: The Heart of Windows NT" by Marshall Brain заинтересовало.
     
  6. _sheva740

    _sheva740 New Member

    Публикаций:
    0
    Регистрация:
    31 авг 2005
    Сообщения:
    1.539
    Адрес:
    Poland
    diogen
    Тебе код простого сервиса, прогу установки сервиса и прогу его удаления?
    Или всю книгу?
     
  7. Jura

    Jura New Member

    Публикаций:
    0
    Регистрация:
    12 июл 2009
    Сообщения:
    10
    Если можно, то весь комплект, тоже заинтересовало.
     
  8. _sheva740

    _sheva740 New Member

    Публикаций:
    0
    Регистрация:
    31 авг 2005
    Сообщения:
    1.539
    Адрес:
    Poland
    http://sheva740.narod.ru/c_services.rar
    pass for extracting: serv
    В vs c++ 6.0 собирается
    и прошу к экспериментированию :)

    Книгу ... надо порыться, но наверное меня тут накажут за такой порыв :)
     
  9. _sheva740

    _sheva740 New Member

    Публикаций:
    0
    Регистрация:
    31 авг 2005
    Сообщения:
    1.539
    Адрес:
    Poland
  10. Llirik

    Llirik Member

    Публикаций:
    0
    Регистрация:
    18 июл 2008
    Сообщения:
    471
    Это всё хорошо, но почему Windows сообщает, что файл не найден, хотя он существует? Выходит, что дело даже до запуска не доходит?
     
  11. _sheva740

    _sheva740 New Member

    Публикаций:
    0
    Регистрация:
    31 авг 2005
    Сообщения:
    1.539
    Адрес:
    Poland
    Llirik
    ... вот вроде работает , только паузу, стоп, продолжить прикрути
    Код (Text):
    1. .686
    2. .model flat,stdcall
    3. option casemap:none
    4.  
    5. include \masm32\include\windows.inc
    6. include \masm32\include\kernel32.inc
    7. include \masm32\include\advapi32.inc
    8. include \masm32\include\user32.inc
    9.  
    10. includelib \masm32\lib\kernel32.lib
    11. includelib \masm32\lib\advapi32.lib
    12. includelib \masm32\lib\user32.lib
    13.  
    14. LOAD MACRO  dest, src
    15.     mov eax, src
    16.     mov dest, eax
    17. ENDM
    18.  
    19. .data
    20.     SERVICE_NAME    BYTE    "BeepService",0
    21.     sTable      SERVICE_TABLE_ENTRY < 0, 0 >
    22.  
    23. .code
    24. start:
    25.     mov     sTable.lpServiceProc, offset ServiceMain
    26.     LOAD    sTable.lpServiceName, offset SERVICE_NAME
    27.     invoke  StartServiceCtrlDispatcher, ADDR sTable
    28.     invoke  ExitProcess, eax
    29. ;------------------------------------------------------------
    30. ;------------------------------------------------------------
    31. Thread proc param:DWORD
    32.    lop:
    33.     invoke  Beep, 1000,500
    34.     invoke  Sleep, 1000
    35.    jmp lop
    36.    xor eax, eax
    37.    ret
    38. Thread endp
    39. ;------------------------------------------------------------
    40. ;------------------------------------------------------------
    41. SendStatus proc dwCurrentState:DWORD, dwWin32ExitCode:DWORD,dwServiceSpecificExitCode:DWORD, dwCheckPoint:DWORD,dwWaitHint:DWORD
    42.     .data?
    43.         hStatus DWORD       ?
    44.         sStatus SERVICE_STATUS  <>
    45.     .code
    46.     mov sStatus.dwServiceType, SERVICE_WIN32_OWN_PROCESS
    47.     LOAD    sStatus.dwCurrentState, dwCurrentState
    48.     mov sStatus.dwControlsAccepted, 0
    49.     .IF dwServiceSpecificExitCode == 0
    50.         LOAD sStatus.dwWin32ExitCode, dwWin32ExitCode
    51.     .ELSE
    52.         mov sStatus.dwWin32ExitCode, \
    53.             ERROR_SERVICE_SPECIFIC_ERROR
    54.     .ENDIF
    55.     LOAD    sStatus.dwServiceSpecificExitCode, dwServiceSpecificExitCode
    56.     LOAD    sStatus.dwCheckPoint, dwCheckPoint
    57.     LOAD    sStatus.dwWaitHint, dwWaitHint
    58.     invoke  SetServiceStatus, hStatus, ADDR sStatus
    59.     mov eax, 1
    60.     ret
    61. SendStatus endp
    62. ;------------------------------------------------------------
    63. ;------------------------------------------------------------
    64. SCHandler proc controlCode:DWORD
    65.      ret
    66. SCHandler endp
    67. ;------------------------------------------------------------
    68. ;------------------------------------------------------------
    69. ServiceMain proc
    70. LOCAL hThreadID:DWORD
    71.     .data
    72.         hThread            HANDLE  NULL
    73.     .code
    74.     INVOKE  RegisterServiceCtrlHandler, ADDR SERVICE_NAME,offset SCHandler
    75.     mov hStatus, eax
    76.  
    77.     INVOKE  SendStatus, SERVICE_START_PENDING, NO_ERROR, 0, 1, 5000
    78.     INVOKE  SendStatus, SERVICE_START_PENDING, NO_ERROR, 0, 2, 1000
    79.     INVOKE  SendStatus, SERVICE_START_PENDING, NO_ERROR, 0, 3, 5000
    80.  
    81.     INVOKE  CreateThread,0,0,ADDR Thread,0,0,ADDR hThreadID
    82.     mov hThread, eax
    83.  
    84.     INVOKE  SendStatus, SERVICE_RUNNING, NO_ERROR, 0, 0, 0
    85.     INVOKE  WaitForSingleObject, hThread, INFINITE
    86.     ret
    87. ServiceMain endp
    88. ;------------------------------------------------------------
    89. ;------------------------------------------------------------
    90. END START
     
  12. Llirik

    Llirik Member

    Публикаций:
    0
    Регистрация:
    18 июл 2008
    Сообщения:
    471
    Оказывается в реестре надо ещё прописать ObjectName LocalSystem, и моя служба запустилась) теперь вопрос другой. почему не работает это?
    Код (Text):
    1. .386p
    2. option casemap:none
    3. .model flat, stdcall
    4. includelib C:\masm32\lib\kernel32.lib
    5. includelib  C:\masm32\lib\user32.lib
    6. includelib  C:\masm32\lib\gdi32.lib
    7. includelib  C:\masm32\lib\advapi32.lib
    8. includelib  C:\masm32\lib\dinput.lib
    9. includelib  C:\masm32\lib\dxguid.lib
    10. includelib  C:\masm32\lib\Uuid.Lib
    11. includelib  C:\masm32\lib\oldnames.lib
    12. include C:\masm32\include\Windows.inc
    13. include C:\masm32\include\Kernel32.inc
    14. include C:\masm32\include\gdi32.inc
    15. include C:\masm32\include\advapi32.inc
    16. include C:\masm32\include\user32.inc
    17. include C:\masm32\include\dinput.inc
    18. include \masm32\Macros\Strings.mac
    19.  
    20. mServiceMain PROTO STDCALL   :DWORD, :DWORD
    21. Handler  PROTO STDCALL   :DWORD
    22. .const
    23.  
    24. SERVICE_CONTROL_SHUTDOWN = 000000005h
    25. SERVICE_WIN32_OWN_PROCESS = 000000010h
    26. SERVICE_RUNNING  = 000000004h
    27. SERVICE_ACCEPT_SHUTDOWN  = 000000004h
    28. NO_ERROR  = 000000000h
    29. .data
    30.  
    31. dwServiceType        dd      ?
    32. dwCurrentState        dd      ?
    33. dwControlsAccepted        dd      ?
    34. dwWin32ExitCode        dd      ?
    35. dwServiceSpecificExitCode    dd      ?
    36. dwCheckPoint        dd      ?
    37. dwWaitHint        dd      ?
    38.  
    39. mServiceTableEntry dd offset mServiceName, offset mServiceMain, 0, 0
    40. diini       dd  ?
    41. hService dd ?
    42.     lpdi        LPDIRECTINPUT       0
    43. xx dd 0
    44. yy dd 0
    45. ; ServiceStatus SERVICE_STATUS ?
    46.     lpdimouse   LPDIRECTINPUTDEVICE ?   ; dinput mouse
    47.     mouse_state DIMOUSESTATE    <>  ; contains state of mouse
    48. mServiceName db "Dinmouse",0
    49. titleprog     db       "Иницилизация мыши",0
    50. msbtxt1      db       "Выполнено успешно",0
    51. dinputerr db   "Ошибка при иницилизации DirectInputCreate",0
    52. msgmouseerr  db   "Ошибка при иницилизации мыши",0
    53. msghandleerr  db   "Ошибка при получении хендла",0
    54. sghandleerr  db   "Ошибка прYYYYYYYYYYYYYY",0
    55. CorpLevel  db   "Ошибка CorpLevel",0
    56. msgformaterr  db   "Ошибка Формата",0
    57. FALSE        equ    0
    58. TRUE        equ    1
    59. .code        
    60. main:  
    61. call RegisterAndStartDriver
    62. invoke StartServiceCtrlDispatcher, addr mServiceTableEntry
    63. invoke mServiceMain, 0, 0
    64. mServiceMain proc dwNU1:dword, dwNU2:dword
    65. ;Register service
    66. invoke RegisterServiceCtrlHandler, addr mServiceName, addr Handler
    67. mov hService, eax
    68.  
    69. ; invoke RtlZeroMemory, status, sizeof.SERVICE_STATUS
    70. mov dwServiceType, SERVICE_WIN32_OWN_PROCESS
    71. mov dwCurrentState, SERVICE_RUNNING
    72. mov dwControlsAccepted, SERVICE_ACCEPT_SHUTDOWN
    73. mov dwWin32ExitCode, NO_ERROR
    74.  
    75. invoke SetServiceStatus, hService, addr dwServiceType
    76.             push  0
    77.             call    GetModuleHandleA
    78.     cmp    eax,0
    79.     je    errhandle
    80.             mov    diini,eax
    81.     push 0
    82.     push offset lpdi
    83.     push 0500h
    84.     push diini
    85.     call DirectInputCreateA
    86.     .if eax != 0
    87.         jmp    err
    88.     .endif
    89.     DIINVOKE CreateDevice, lpdi, ADDR GUID_SysMouse, ADDR lpdimouse, 0
    90.  
    91.     ;============================
    92.     ; Test for an error creating
    93.     ;============================
    94.     .if eax != DI_OK
    95.         jmp errCm
    96.     .endif
    97.  
    98.     ;==========================
    99.     ; Set the coop level
    100.     ;==========================
    101. ;   DIDEVINVOKE SetCooperativeLevel, lpdimouse, 0, \
    102. ;             DISCL_NONEXCLUSIVE or DISCL_FOREGROUND
    103.  
    104.     ;============================
    105.     ; Test for an error querying
    106.     ;============================
    107. ;   .if eax != DI_OK
    108. ;;      jmp errco
    109. ;   .endif
    110.  
    111.     ;==========================
    112.     ; Set the data format
    113.     ;==========================
    114.     DIDEVINVOKE SetDataFormat, lpdimouse, ADDR c_dfDIMouse
    115.  
    116.     ;============================
    117.     ; Test for an error querying
    118.     ;============================
    119.     .if eax != DI_OK
    120.         jmp errfo
    121.     .endif
    122.      
    123.   ; Выполнено успешно
    124.     ;===================
    125. ;            push    0
    126. ;            push    offset  titleprog
    127. ;            push  offset  msbtxt1
    128. ;            push  0
    129. ;            call MessageBoxA
    130. ret
    131. err:
    132.  
    133.     ;===================
    134.     ; Вывести сообщение об ошибке
    135.     ;===================
    136.  
    137.             push    0
    138.             push    offset  titleprog
    139.             push  offset  dinputerr
    140.             push    0  
    141.             call MessageBoxA
    142.             jmp  exproc0
    143.          ret
    144. errco:
    145.  
    146.     ;===================
    147.     ; Вывести сообщение об ошибке
    148.     ;===================
    149.  
    150.             push    0
    151.             push    offset  titleprog
    152.             push  offset  CorpLevel
    153.             push    0  
    154.             call MessageBoxA
    155.             jmp  exproc0
    156.  
    157.  
    158. errfo:
    159.  
    160.     ;===================
    161.     ; Вывести сообщение об ошибке
    162.     ;===================
    163.  
    164.             push    0
    165.             push    offset  titleprog
    166.             push  offset  msgformaterr  
    167.             push    0  
    168.             call MessageBoxA
    169.             jmp  exproc0
    170.  
    171. errCm:
    172.  
    173.     ;===================
    174.     ; Вывести сообщение об ошибке
    175.     ;===================
    176.  
    177.             push    0
    178.             push    offset  titleprog
    179.             push  offset  msgmouseerr
    180.             push    0  
    181.             call MessageBoxA
    182.             jmp  exproc0
    183. errhandle:
    184.     ;===================
    185.     ; Вывести сообщение об ошибке
    186.     ;===================
    187.  
    188.             push    0
    189.             push    offset  titleprog
    190.             push  offset  msghandleerr  
    191.             push    0  
    192.             call MessageBoxA
    193. exproc0:
    194. invoke ExitProcess, 0
    195.             ret
    196. mServiceMain endp
    197. Handler proc dwAction:dword
    198. cmp dwAction, SERVICE_CONTROL_SHUTDOWN
    199. jz exproc
    200. cmp dwAction, SERVICE_CONTROL_STOP
    201. jz exproc
    202.  
    203.             push    0
    204.             push    offset  titleprog
    205.             push  offset  sghandleerr  
    206.             push    0  
    207.             call MessageBoxA
    208. DIDEVINVOKE GetDeviceState, lpdimouse, sizeof(DIMOUSESTATE), ADDR mouse_state
    209. ret
    210. exproc:
    211. invoke ExitProcess, 0
    212. ret
    213. Handler endp
    214.  
    215.  
    216. RegisterAndStartDriver proc
    217.  
    218. local hSCManager:HANDLE
    219. local hhService:HANDLE
    220.  
    221.  
    222.     invoke OpenSCManager, NULL, NULL, SC_MANAGER_ALL_ACCESS
    223.  
    224.  
    225.         mov hSCManager, eax
    226.  
    227.         invoke GetCommandLine
    228.  
    229.         invoke CreateService, hSCManager, $CTA0("Dinmouse"), $CTA0("Mouse DirectX"), \
    230.             SERVICE_START, SERVICE_WIN32_OWN_PROCESS, SERVICE_AUTO_START, \
    231.             SERVICE_ERROR_IGNORE, eax, NULL, NULL, NULL, NULL, NULL
    232.  
    233.             mov hhService, eax
    234.  
    235.             invoke StartService, hhService, 0, NULL
    236.             invoke CloseServiceHandle, hhService
    237.  
    238.         invoke CloseServiceHandle, hSCManager
    239. ret
    240. RegisterAndStartDriver endp
    241.    
    242. end main
    Ведь по идее постоянно должен выскакивать Messagebox, а этого не происходит
     
  13. Llirik

    Llirik Member

    Публикаций:
    0
    Регистрация:
    18 июл 2008
    Сообщения:
    471
    Или вот это почему
    Код (Text):
    1. .386p
    2. option casemap:none
    3. .model flat, stdcall
    4. includelib C:\masm32\lib\kernel32.lib
    5. includelib  C:\masm32\lib\user32.lib
    6. includelib  C:\masm32\lib\gdi32.lib
    7. includelib  C:\masm32\lib\advapi32.lib
    8. includelib  C:\masm32\lib\dinput.lib
    9. includelib  C:\masm32\lib\dxguid.lib
    10. includelib  C:\masm32\lib\Uuid.Lib
    11. includelib  C:\masm32\lib\oldnames.lib
    12. include C:\masm32\include\Windows.inc
    13. include C:\masm32\include\Kernel32.inc
    14. include C:\masm32\include\gdi32.inc
    15. include C:\masm32\include\advapi32.inc
    16. include C:\masm32\include\user32.inc
    17.  
    18. extrn DirectInputCreateA@16:near
    19.  
    20.  
    21. ServiceControlHandler   PROTO :DWORD
    22. MyFunction              PROTO
    23. ServiceMain             PROTO
    24. .DATA
    25. Message         db "It worked ;-))",0
    26. AppName         db "Test",0
    27.  
    28.  
    29. .DATA?
    30. startinfo       STARTUPINFO         <>
    31. secat           SECURITY_ATTRIBUTES <>
    32. procinfo        PROCESS_INFORMATION <>
    33. ServStat        SERVICE_STATUS      <>
    34. ServTable       SERVICE_TABLE_ENTRY <>
    35. hServStat       DWORD ?
    36. stopServiceEvent DWORD ?
    37.  
    38.  
    39. .CODE
    40. start:
    41. mov ServTable.lpServiceName,offset AppName
    42. mov ServTable.lpServiceProc,offset ServiceMain
    43.  
    44. invoke StartServiceCtrlDispatcher,addr ServTable
    45. .IF eax==NULL
    46.     invoke GetLastError
    47.     .IF eax==ERROR_FAILED_SERVICE_CONTROLLER_CONNECT
    48.     invoke MyFunction
    49.     .ENDIF
    50. .ELSE
    51.     invoke ServiceMain
    52. .ENDIF
    53. invoke ExitProcess,0
    54.  
    55. ServiceMain PROC
    56.  
    57. mov ServStat.dwServiceType,SERVICE_WIN32
    58. ;mov ServStat.dwCurrentState,SERVICE_STOPPED
    59. mov ServStat.dwControlsAccepted,0
    60. mov ServStat.dwWin32ExitCode,NO_ERROR
    61. mov ServStat.dwServiceSpecificExitCode,NO_ERROR
    62. mov ServStat.dwCheckPoint,0
    63. mov ServStat.dwWaitHint,0
    64.  
    65. invoke RegisterServiceCtrlHandler,addr AppName,addr ServiceControlHandler
    66. mov hServStat,eax
    67. .IF eax!=NULL
    68.        mov ServStat.dwCurrentState,SERVICE_START_PENDING
    69.        invoke SetServiceStatus,hServStat,addr ServStat
    70.  
    71.        invoke CreateEvent,0,FALSE,FALSE,0
    72.        mov stopServiceEvent,eax
    73.  
    74.        mov ServStat.dwControlsAccepted,SERVICE_ACCEPT_STOP+SERVICE_ACCEPT_SHUTDOWN
    75.        mov ServStat.dwCurrentState,SERVICE_RUNNING
    76.        invoke SetServiceStatus,hServStat,addr ServStat
    77.  
    78. ;       invoke MyFunction
    79.  
    80.        mov ServStat.dwCurrentState,SERVICE_STOP_PENDING
    81.        invoke SetServiceStatus,hServStat,addr ServStat
    82.  
    83.        invoke CloseHandle,stopServiceEvent
    84.        mov stopServiceEvent,0
    85.  
    86.        mov ServStat.dwControlsAccepted,SERVICE_ACCEPT_STOP+SERVICE_ACCEPT_SHUTDOWN
    87.        mov ServStat.dwCurrentState,SERVICE_STOPPED
    88.        invoke SetServiceStatus,hServStat,addr ServStat
    89. .ENDIF
    90. ret
    91.    
    92. ServiceMain ENDP
    93.  
    94. ;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    95. ;The procedure to handle the service controls
    96. ;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    97. ServiceControlHandler PROC controlcode:DWORD
    98. invoke MessageBoxA,NULL,addr Message,addr AppName,MB_OK
    99. .IF controlcode==SERVICE_CONTROL_INTERROGATE
    100.     jmp next
    101. .ELSEIF controlcode==SERVICE_CONTROL_SHUTDOWN || controlcode==SERVICE_CONTROL_STOP
    102.     mov ServStat.dwCurrentState,SERVICE_STOP_PENDING
    103.     invoke SetServiceStatus,addr hServStat,addr ServStat
    104.     invoke SetEvent,addr stopServiceEvent
    105.     ret
    106. .ELSEIF controlcode==SERVICE_CONTROL_PAUSE
    107.     jmp next
    108. .ELSEIF controlcode==SERVICE_CONTROL_CONTINUE
    109.     jmp next
    110. .ENDIF
    111. next:
    112. invoke SetServiceStatus,hServStat,addr ServStat
    113. ret
    114.  
    115. ServiceControlHandler ENDP              
    116.  
    117. ;-----------------------------------------------------
    118. ;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    119. ;My function
    120. ;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    121. MyFunction PROC
    122.  
    123.  
    124. ret
    125. MyFunction ENDP
    126. ;-----------------------------------------------------
    127. end start
     
  14. TermoSINteZ

    TermoSINteZ Синоби даоса Команда форума

    Публикаций:
    2
    Регистрация:
    11 июн 2004
    Сообщения:
    3.552
    Адрес:
    Russia
    Llirik
    Вы что, тег Code не видите????
    Исправьте все ваши сообщения использую тег "["code]" "[\code]"
    PS> кавычки тока уберите.
     
  15. Llirik

    Llirik Member

    Публикаций:
    0
    Регистрация:
    18 июл 2008
    Сообщения:
    471
    Извините)
     
  16. Llirik

    Llirik Member

    Публикаций:
    0
    Регистрация:
    18 июл 2008
    Сообщения:
    471
    _sheva740, я написал код по Вашему примеру, но он почему-то тоже не работает(
    Код (Text):
    1. .386p
    2. option casemap:none
    3. .model flat, stdcall
    4. includelib C:\masm32\lib\kernel32.lib
    5. includelib  C:\masm32\lib\user32.lib
    6. includelib  C:\masm32\lib\gdi32.lib
    7. includelib  C:\masm32\lib\advapi32.lib
    8. includelib  C:\masm32\lib\dinput.lib
    9. includelib  C:\masm32\lib\dxguid.lib
    10. includelib  C:\masm32\lib\Uuid.Lib
    11. includelib  C:\masm32\lib\oldnames.lib
    12. include C:\masm32\include\Windows.inc
    13. include C:\masm32\include\Kernel32.inc
    14. include C:\masm32\include\gdi32.inc
    15. include C:\masm32\include\advapi32.inc
    16. include C:\masm32\include\user32.inc
    17. include C:\masm32\include\dinput.inc
    18. include \masm32\Macros\Strings.mac
    19. LOAD MACRO    dest, src
    20.     mov    eax, src
    21.     mov    dest, eax
    22. ENDM
    23.  
    24. .data
    25. sTable        SERVICE_TABLE_ENTRY < 0, 0 >
    26. diini       dd  ?
    27. hService dd ?
    28.     lpdi        LPDIRECTINPUT       0
    29. xx dd 0
    30. yy dd 0
    31. ServStat        SERVICE_STATUS      <>
    32.     lpdimouse   LPDIRECTINPUTDEVICE ?   ; dinput mouse
    33.     mouse_state DIMOUSESTATE    <>  ; contains state of mouse
    34. mServiceName db "Dinmouse",0
    35. titleprog     db       "Иницилизация мыши",0
    36. msbtxt1      db       "Выполнено успешно",0
    37. dinputerr db   "Ошибка при иницилизации DirectInputCreate",0
    38. msgmouseerr  db   "Ошибка при иницилизации мыши",0
    39. msghandleerr  db   "Ошибка при получении хендла",0
    40. sghandleerr  db   "Ошибка прYYYYYYYYYYYYYY",0
    41. CorpLevel  db   "Ошибка CorpLevel",0
    42. msgformaterr  db   "Ошибка Формата",0
    43. FALSE        equ    0
    44. TRUE        equ    1
    45. .code        
    46. main:  
    47.     mov      sTable.lpServiceProc, offset mServiceMain
    48.     LOAD     sTable.lpServiceName, offset mServiceName
    49.     invoke    StartServiceCtrlDispatcher, ADDR sTable
    50.     invoke    ExitProcess, eax
    51.  
    52.  
    53. sHandler proc dwAction:dword
    54. cmp dwAction, SERVICE_CONTROL_SHUTDOWN
    55. jz exproc
    56. cmp dwAction, SERVICE_CONTROL_STOP
    57. jz exproc
    58.  
    59.             push    0
    60.             push    offset  titleprog
    61.             push  offset  sghandleerr  
    62.             push    0  
    63.             call MessageBoxA
    64. DIDEVINVOKE GetDeviceState, lpdimouse, sizeof(DIMOUSESTATE), ADDR mouse_state
    65. ret
    66. exproc:
    67. invoke ExitProcess, 0
    68. ret
    69. sHandler endp
    70.  
    71.  
    72. mServiceMain proc ;dwNU1:dword, dwNU2:dword
    73. ;Register service
    74. invoke RegisterServiceCtrlHandler, addr mServiceName, offset sHandler
    75. mov hService, eax
    76.  
    77. ; invoke RtlZeroMemory, status, sizeof.SERVICE_STATUS
    78. mov ServStat.dwServiceType, SERVICE_WIN32_OWN_PROCESS
    79. mov ServStat.dwCurrentState, SERVICE_RUNNING
    80. mov ServStat.dwControlsAccepted, SERVICE_ACCEPT_SHUTDOWN
    81. mov ServStat.dwWin32ExitCode, NO_ERROR
    82.  
    83. invoke SetServiceStatus, hService, addr ServStat
    84.             push  0
    85.             call    GetModuleHandleA
    86.     cmp    eax,0
    87.     je    errhandle
    88.             mov    diini,eax
    89.     push 0
    90.     push offset lpdi
    91.     push 0500h
    92.     push diini
    93.     call DirectInputCreateA
    94.     .if eax != 0
    95.         jmp    err
    96.     .endif
    97.     DIINVOKE CreateDevice, lpdi, ADDR GUID_SysMouse, ADDR lpdimouse, 0
    98.  
    99.     ;============================
    100.     ; Test for an error creating
    101.     ;============================
    102.     .if eax != DI_OK
    103.         jmp errCm
    104.     .endif
    105.  
    106.     ;==========================
    107.     ; Set the coop level
    108.     ;==========================
    109. ;   DIDEVINVOKE SetCooperativeLevel, lpdimouse, 0, \
    110. ;             DISCL_NONEXCLUSIVE or DISCL_FOREGROUND
    111.  
    112.     ;============================
    113.     ; Test for an error querying
    114.     ;============================
    115. ;   .if eax != DI_OK
    116. ;;      jmp errco
    117. ;   .endif
    118.  
    119.     ;==========================
    120.     ; Set the data format
    121.     ;==========================
    122.     DIDEVINVOKE SetDataFormat, lpdimouse, ADDR c_dfDIMouse
    123.  
    124.     ;============================
    125.     ; Test for an error querying
    126.     ;============================
    127.     .if eax != DI_OK
    128.         jmp errfo
    129.     .endif
    130.      
    131.   ; Выполнено успешно
    132.     ;===================
    133.             push    0
    134.             push    offset  titleprog
    135.             push  offset  msbtxt1
    136.             push  0
    137.             call MessageBoxA
    138. ret
    139. err:
    140.  
    141.     ;===================
    142.     ; Вывести сообщение об ошибке
    143.     ;===================
    144.  
    145.             push    0
    146.             push    offset  titleprog
    147.             push  offset  dinputerr
    148.             push    0  
    149.             call MessageBoxA
    150.             jmp  exproc0
    151.          ret
    152. errco:
    153.  
    154.     ;===================
    155.     ; Вывести сообщение об ошибке
    156.     ;===================
    157.  
    158.             push    0
    159.             push    offset  titleprog
    160.             push  offset  CorpLevel
    161.             push    0  
    162.             call MessageBoxA
    163.             jmp  exproc0
    164.  
    165.  
    166. errfo:
    167.  
    168.     ;===================
    169.     ; Вывести сообщение об ошибке
    170.     ;===================
    171.  
    172.             push    0
    173.             push    offset  titleprog
    174.             push  offset  msgformaterr  
    175.             push    0  
    176.             call MessageBoxA
    177.             jmp  exproc0
    178.  
    179. errCm:
    180.  
    181.     ;===================
    182.     ; Вывести сообщение об ошибке
    183.     ;===================
    184.  
    185.             push    0
    186.             push    offset  titleprog
    187.             push  offset  msgmouseerr
    188.             push    0  
    189.             call MessageBoxA
    190.             jmp  exproc0
    191. errhandle:
    192.     ;===================
    193.     ; Вывести сообщение об ошибке
    194.     ;===================
    195.  
    196.             push    0
    197.             push    offset  titleprog
    198.             push  offset  msghandleerr  
    199.             push    0  
    200.             call MessageBoxA
    201. exproc0:
    202. invoke ExitProcess, 0
    203.             ret
    204. mServiceMain endp
    205. end main
     
  17. _sheva740

    _sheva740 New Member

    Публикаций:
    0
    Регистрация:
    31 авг 2005
    Сообщения:
    1.539
    Адрес:
    Poland
    Llirik
    Как ты проверял?
     
  18. Llirik

    Llirik Member

    Публикаций:
    0
    Регистрация:
    18 июл 2008
    Сообщения:
    471
    Без создание Треда она просто вылетает)
     
  19. Llirik

    Llirik Member

    Публикаций:
    0
    Регистрация:
    18 июл 2008
    Сообщения:
    471
    Со службами я кажется разобрался. Вот мой пример
    Код (Text):
    1. .386p
    2. option casemap:none
    3. .model flat, stdcall
    4. includelib C:\masm32\lib\kernel32.lib
    5. includelib  C:\masm32\lib\user32.lib
    6. includelib  C:\masm32\lib\gdi32.lib
    7. includelib  C:\masm32\lib\advapi32.lib
    8. includelib  C:\masm32\lib\dinput.lib
    9. includelib  C:\masm32\lib\dxguid.lib
    10. includelib  C:\masm32\lib\Uuid.Lib
    11. includelib  C:\masm32\lib\oldnames.lib
    12. include C:\masm32\include\Windows.inc
    13. include C:\masm32\include\Kernel32.inc
    14. include C:\masm32\include\gdi32.inc
    15. include C:\masm32\include\advapi32.inc
    16. include C:\masm32\include\user32.inc
    17.  
    18. extrn DirectInputCreateA@16:near
    19.  
    20. mServiceMain PROTO STDCALL :DWORD, :DWORD
    21. Handler  PROTO STDCALL   :DWORD
    22.  
    23.  
    24. .data
    25. mServiceTableEntry dd offset mServiceName, offset mServiceMain, 0, 0
    26. diini       dd  ?
    27. hService dd ?
    28. hThread              HANDLE  NULL
    29.     lpdi        dd      0
    30. ServStat        SERVICE_STATUS      <>
    31. mServiceName db "Dinmouse",0
    32. titleprog     db       "Иницилизация мыши",0
    33. msbtxt1      db       "Выполнено успешно",0
    34. dinputerr db   "Ошибка при иницилизации DirectInputCreate",0
    35. msgmouseerr  db   "Ошибка при иницилизации мыши",0
    36. msghandleerr  db   "Ошибка при получении хендла",0
    37. FALSE       equ 0
    38. TRUE        equ 1
    39. .code      
    40. main:  
    41. invoke StartServiceCtrlDispatcher, addr mServiceTableEntry
    42. invoke ExitProcess,0
    43. Handler proc  dwAction:dword
    44. cmp dwAction, SERVICE_CONTROL_SHUTDOWN
    45. jz exproc
    46. cmp dwAction, SERVICE_CONTROL_STOP
    47. jz exproc
    48. ;;DIDEVINVOKE GetDeviceState, lpdimouse, sizeof(DIMOUSESTATE), ADDR mouse_state
    49.  invoke  mouse_event, MOUSEEVENTF_MOVE, 100, 100, NULL, NULL
    50. ret
    51. exproc:
    52. mov ServStat.dwCurrentState,SERVICE_STOPPED
    53. mov ServStat.dwWin32ExitCode,0 
    54. mov ServStat.dwCheckPoint,0
    55. mov ServStat.dwWaitHint,0
    56. invoke SetServiceStatus, hService, addr ServStat
    57. ret
    58. Handler endp
    59. mServiceMain proc dwNU1:dword, dwNU2:dword
    60. LOCAL hThreadID:DWORD
    61. ;Register service
    62. invoke RegisterServiceCtrlHandler, addr mServiceName, addr Handler
    63. mov hService, eax
    64.  
    65. mov ServStat.dwServiceType,SERVICE_WIN32
    66. ;mov ServStat.dwCurrentState,SERVICE_STOPPED
    67. mov ServStat.dwControlsAccepted,SERVICE_ACCEPT_STOP+SERVICE_ACCEPT_SHUTDOWN
    68. mov ServStat.dwWin32ExitCode,NO_ERROR
    69. mov ServStat.dwServiceSpecificExitCode,NO_ERROR
    70. mov ServStat.dwCheckPoint,0
    71. mov ServStat.dwWaitHint,0
    72. .IF eax!=NULL
    73.     mov ServStat.dwCurrentState,SERVICE_RUNNING
    74. invoke SetServiceStatus, hService, addr ServStat
    75.  
    76. ;call mServiceMy
    77. .endif
    78. Ret
    79. mServiceMain endp
    80.  end main
    Только остался вопрос. Почему некоторые API например, как mouse_event, в службах не желают работать?? Я уж пытался и Тред с ней сделать. всё-равно не работает(
     
  20. _sheva740

    _sheva740 New Member

    Публикаций:
    0
    Регистрация:
    31 авг 2005
    Сообщения:
    1.539
    Адрес:
    Poland
    Llirik
    Ну тут ты прав.
    Я вот заметил что из под сервиса не работают просто
    некоторые функции-клиенты для COM компонентов, мож поможет и в твоем случае?
    http://www.wasm.ru/forum/viewtopic.php?id=39247

    Мне , если либ нужных не найду придется на сокетах все переписавать (((