archrival 0 Posted December 1, 2004 How robust is the DllCall function? I was hoping I might be able to integrate functions from advapi32.dll, ws2_32.dll, ntdll.dll among others. I'd like to be able to stop using psservice.exe to check, start and stop services on remote machines and integrate that functionality into my own script. I've used Dependency Walker, figured out what functions psservice.exe calls and in what DLLs they exist. I've been to MSDN and discovered the parameters of most of the functions, some are undocumented. I don't know if I'm doing it properly though.Here's an example:ControlService() in advapi32.dll requires OpenService() which requires OpenSCManager().I figure that with those functions, I should be able to do what I need to do without the use of an external program. I've tried to implement them, but I can't seem to figure it out. Unfortunately I lost the code I had for it, it wasn't that long anyway. I'm just curious if it's even possible at this stage or if I'm wasting my time trying to get it to work. I've tried to get the handles for each subsequent function and passing it on to the next as a parameter, which sounds like what I need to do. It returns a NULL string though. I've gotten the DllCall to work though, I've set up a script that locks the Desktop:DllCall("user32.dll", "int", "LockWorkstation")Obviously a lot easier than what I'm trying to accomplish, but at least I'm doing something right. Share this post Link to post Share on other sites
this-is-me 6 Posted December 1, 2004 expandcollapse popupGlobal $STANDARD_RIGHTS_REQUIRED = 0x000F0000 Global $SC_MANAGER_CONNECT = 0x0001 Global $SC_MANAGER_CREATE_SERVICE = 0x0002 Global $SC_MANAGER_ENUMERATE_SERVICE = 0x0004 Global $SC_MANAGER_LOCK = 0x0008 Global $SC_MANAGER_QUERY_LOCK_STATUS = 0x0010 Global $SC_MANAGER_MODIFY_BOOT_CONFIG = 0x0020 Global $SC_MANAGER_ALL_ACCESS = BitOR($STANDARD_RIGHTS_REQUIRED, _ $SC_MANAGER_CONNECT, _ $SC_MANAGER_CREATE_SERVICE, _ $SC_MANAGER_ENUMERATE_SERVICE, _ $SC_MANAGER_LOCK, _ $SC_MANAGER_QUERY_LOCK_STATUS, _ $SC_MANAGER_MODIFY_BOOT_CONFIG) Global $SERVICE_QUERY_CONFIG = 0x0001 Global $SERVICE_CHANGE_CONFIG = 0x0002 Global $SERVICE_QUERY_STATUS = 0x0004 Global $SERVICE_ENUMERATE_DEPENDENTS = 0x0008 Global $SERVICE_START = 0x0010 Global $SERVICE_STOP = 0x0020 Global $SERVICE_PAUSE_CONTINUE = 0x0040 Global $SERVICE_INTERROGATE = 0x0080 Global $SERVICE_CONTROL_INTERROGATE = 0x00000004 Global $SERVICE_USER_DEFINED_CONTROL = 0x0100 Global $SERVICE_ALL_ACCESS = BitOR($STANDARD_RIGHTS_REQUIRED, _ $SERVICE_QUERY_CONFIG, _ $SERVICE_CHANGE_CONFIG, _ $SERVICE_QUERY_STATUS, _ $SERVICE_ENUMERATE_DEPENDENTS, _ $SERVICE_START, _ $SERVICE_STOP, _ $SERVICE_PAUSE_CONTINUE, _ $SERVICE_INTERROGATE, _ $SERVICE_USER_DEFINED_CONTROL) Global $SERVICE_CONTROL_STOP = 0x00000001 ; Example - start print spooler If _ServiceExists("Spooler") Then _StopService("Spooler") Func _StartService($sServiceName) Local $arRet Local $hSC Local $hService Local $lError = -1 $arRet = DllCall("advapi32.dll", "long", "OpenSCManager", _ "str", "", _ "str", "ServicesActive", _ "long", $SC_MANAGER_CONNECT) If $arRet[0] = 0 Then $arRet = DllCall("kernel32.dll", "long", "GetLastError") $lError = $arRet[0] Else $hSC = $arRet[0] $arRet = DllCall("advapi32.dll", "long", "OpenService", _ "long", $hSC, _ "str", $sServiceName, _ "long", $SERVICE_START) If $arRet[0] = 0 Then $arRet = DllCall("kernel32.dll", "long", "GetLastError") $lError = $arRet[0] Else $hService = $arRet[0] $arRet = DllCall("advapi32.dll", "int", "StartService", _ "long", $hService, _ "long", 0, _ "str", "") If $arRet[0] = 0 Then $arRet = DllCall("kernel32.dll", "long", "GetLastError") $lError = $arRet[0] EndIf DllCall("advapi32.dll", "int", "CloseServiceHandle", "long", $hService) EndIf DllCall("advapi32.dll", "int", "CloseServiceHandle", "long", $hSC) EndIf If $lError <> -1 Then SetError($lError) EndFunc Func _StopService($sServiceName) Local $arRet Local $hSC Local $hService Local $lError = -1 $arRet = DllCall("advapi32.dll", "long", "OpenSCManager", _ "str", "", _ "str", "ServicesActive", _ "long", $SC_MANAGER_CONNECT) If $arRet[0] = 0 Then $arRet = DllCall("kernel32.dll", "long", "GetLastError") $lError = $arRet[0] Else $hSC = $arRet[0] $arRet = DllCall("advapi32.dll", "long", "OpenService", _ "long", $hSC, _ "str", $sServiceName, _ "long", $SERVICE_STOP) If $arRet[0] = 0 Then $arRet = DllCall("kernel32.dll", "long", "GetLastError") $lError = $arRet[0] Else $hService = $arRet[0] $arRet = DllCall("advapi32.dll", "int", "ControlService", _ "long", $hService, _ "long", $SERVICE_CONTROL_STOP, _ "str", "") If $arRet[0] = 0 Then $arRet = DllCall("kernel32.dll", "long", "GetLastError") $lError = $arRet[0] EndIf DllCall("advapi32.dll", "int", "CloseServiceHandle", "long", $hService) EndIf DllCall("advapi32.dll", "int", "CloseServiceHandle", "long", $hSC) EndIf If $lError <> -1 Then SetError($lError) EndFunc Func _ServiceExists($sServiceName) Local $arRet Local $hSC Local $bExist = 0 $arRet = DllCall("advapi32.dll", "long", "OpenSCManager", _ "str", "", _ "str", "ServicesActive", _ "long", $SC_MANAGER_CONNECT) If $arRet[0] <> 0 Then $hSC = $arRet[0] $arRet = DllCall("advapi32.dll", "long", "OpenService", _ "long", $hSC, _ "str", $sServiceName, _ "long", $SERVICE_INTERROGATE) If $arRet[0] <> 0 Then $bExist = 1 DllCall("advapi32.dll", "int", "CloseServiceHandle", "long", $arRet[0]) EndIf DllCall("advapi32.dll", "int", "CloseServiceHandle", "long", $hSC) EndIf Return $bExist EndFunc Func _ServiceRunning($sServiceName) Local $arRet Local $hSC Local $hService Local $bRunning = 0 $arRet = DllCall("advapi32.dll", "long", "OpenSCManager", _ "str", "", _ "str", "ServicesActive", _ "long", $SC_MANAGER_CONNECT) If $arRet[0] <> 0 Then $hSC = $arRet[0] $arRet = DllCall("advapi32.dll", "long", "OpenService", _ "long", $hSC, _ "str", $sServiceName, _ "long", $SERVICE_INTERROGATE) If $arRet[0] <> 0 Then $hService = $arRet[0] $arRet = DllCall("advapi32.dll", "int", "ControlService", _ "long", $hService, _ "long", $SERVICE_CONTROL_INTERROGATE, _ "long_ptr", 0) $bRunning = $arRet[0] DllCall("advapi32.dll", "int", "CloseServiceHandle", "long", $hService) EndIf DllCall("advapi32.dll", "int", "CloseServiceHandle", "long", $hSC) EndIf Return $bRunning EndFunc Who else would I be? Share this post Link to post Share on other sites
this-is-me 6 Posted December 1, 2004 (edited) Another thing. DllCall does not support any structures. If a call to a dll needs them, it won't work and that's all there is. Edited December 1, 2004 by this-is-me Who else would I be? Share this post Link to post Share on other sites
archrival 0 Posted December 1, 2004 Another thing. DllCall does not support any structures. If a call to a dll needs them, it won't work and that's all there is.<{POST_SNAPBACK}>Yeah, after I posted that, I went back to msdn and noticed they were structures... Share this post Link to post Share on other sites
archrival 0 Posted December 1, 2004 Yeah, after I posted that, I went back to msdn and noticed they were structures... <{POST_SNAPBACK}>Also, looking at your code makes me realize that I was fairly close to being accurate. Aside from the structure problem. Share this post Link to post Share on other sites
this-is-me 6 Posted December 1, 2004 BTW, that was not my code. I happened to have it laying around. This code has been submitted here at the forum before. For an FYI, the search feature at the top of this forum is extremey handy in finding code like the one above. Who else would I be? Share this post Link to post Share on other sites
archrival 0 Posted December 1, 2004 BTW, that was not my code. I happened to have it laying around. This code has been submitted here at the forum before. For an FYI, the search feature at the top of this forum is extremey handy in finding code like the one above.<{POST_SNAPBACK}>Yes, I know. Honestly, I never expected someone to have written exactly what I needed, it never even crossed my mind to search. Thankfully someone did and saved me the effort, although I'm definitely going to make sure I understand it, so it will almost be like I wrote it myself... It seemed so obscure. Obviously, I'm going to need to modify it to work on networked machines, but if I recall that's only one parameter on one of those functions, OpenSCManager if I recall correctly. Share this post Link to post Share on other sites