Coded in PB windows service crashes if using InitNetwork()
Posted: Sat Jan 16, 2016 6:07 am
1. Compile the following code to standalone exe
2. Get Process Hacker and create service from your exe using it, or do it another way
3. Run your service, then stop it by sending "stop" command
*service sample by JHP and it seems to be written correctly
2. Get Process Hacker and create service from your exe using it, or do it another way
3. Run your service, then stop it by sending "stop" command
Code: Select all
EnableExplicit
; IncludeFile "net.pb"
Global ServiceName.s = ProgramParameter()
Global lpServiceStatus.SERVICE_STATUS
Global hServiceStatus
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
Procedure ServiceHandler(fdwControl)
Select fdwControl
Case #SERVICE_CONTROL_PAUSE
lpServiceStatus\dwCurrentState = #SERVICE_PAUSED
Case #SERVICE_CONTROL_CONTINUE
lpServiceStatus\dwCurrentState = #SERVICE_RUNNING
Case #SERVICE_CONTROL_STOP, #SERVICE_CONTROL_SHUTDOWN
With lpServiceStatus
\dwCurrentState = #SERVICE_STOP_PENDING
\dwWin32ExitCode = 0
\dwServiceSpecificExitCode = 0
\dwCheckPoint = 0
\dwWaitHint = 0
EndWith
SetServiceStatus_(hServiceStatus, @lpServiceStatus)
lpServiceStatus\dwCurrentState = #SERVICE_STOPPED
SetServiceStatus_(hServiceStatus, @lpServiceStatus)
Case #SERVICE_CONTROL_INTERROGATE
EndSelect
SetServiceStatus_(hServiceStatus, @lpServiceStatus)
EndProcedure
Procedure ServiceMain()
With lpServiceStatus
\dwServiceType = #SERVICE_WIN32_OWN_PROCESS | #SERVICE_INTERACTIVE_PROCESS
\dwCurrentState = #SERVICE_START_PENDING
\dwControlsAccepted = #SERVICE_ACCEPT_STOP | #SERVICE_ACCEPT_SHUTDOWN
\dwWin32ExitCode = 0
\dwServiceSpecificExitCode = 0
\dwCheckPoint = 0
\dwWaitHint = 0
EndWith
hServiceStatus = RegisterServiceCtrlHandler_(ServiceName, @ServiceHandler())
If hServiceStatus
SetServiceStatus_(hServiceStatus, @lpServiceStatus)
lpServiceStatus\dwCurrentState = #SERVICE_RUNNING
SetServiceStatus_(hServiceStatus, @lpServiceStatus)
While lpServiceStatus\dwCurrentState = #SERVICE_RUNNING
; Proxy_tick ()
Delay(1)
Wend
With lpServiceStatus
\dwCurrentState = #SERVICE_STOP_PENDING
\dwWin32ExitCode = 0
\dwServiceSpecificExitCode = 0
\dwCheckPoint = 0
\dwWaitHint = 0
EndWith
SetServiceStatus_(hServiceStatus, @lpServiceStatus)
lpServiceStatus\dwCurrentState = #SERVICE_STOPPED
SetServiceStatus_(hServiceStatus, @lpServiceStatus)
EndIf
EndProcedure
Procedure ServiceInit()
Dim lpServiceTable.SERVICE_TABLE_ENTRY(2)
lpServiceTable(0)\lpServiceName = @ServiceName
lpServiceTable(0)\lpServiceProc = @ServiceMain()
lpServiceTable(1)\lpServiceName = #Null
lpServiceTable(1)\lpServiceProc = #Null
StartServiceCtrlDispatcher_(@lpServiceTable())
EndProcedure
InitNetwork() ; // comment it and there will be no crash
ServiceInit()