Changeset 2343 for trunk/src/advapi32/service.cpp
- Timestamp:
- Jan 6, 2000, 9:05:00 PM (26 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/advapi32/service.cpp
r2173 r2343 1 /* $Id: service.cpp,v 1. 4 1999-12-21 00:35:28sandervl Exp $ */1 /* $Id: service.cpp,v 1.5 2000-01-06 20:05:00 sandervl Exp $ */ 2 2 3 3 /* … … 9 9 * Copyright 1998 Patrick Haller 10 10 * 11 * 12 * TODO: Not done; starting services; control handlers and many other things 13 * TODO: Service status handles are the same as service handles 11 14 * 12 15 * NOTE: Uses registry key for service as handle … … 22 25 #include <odinwrap.h> 23 26 #include <misc.h> 24 #include "advapi32.h"25 27 #include <unicode.h> 26 28 #include <win\winreg.h> 27 29 #include <win\winsvc.h> 28 30 #include <heapstring.h> 31 #define USE_ODIN_REGISTRY_APIS 32 #include "advapi32.h" 29 33 30 34 ODINDEBUGCHANNEL(ADVAPI32-SERVICE) … … 46 50 #define REG_SERVICE_TAG "Tag" 47 51 #define REG_SERVICE_TAG_W (LPWSTR)L"Tag" 52 48 53 //Odin key 54 #define REG_SERVICE_BITS "ServiceBits" 55 #define REG_SERVICE_CONTROLS_ACCEPTED "ServiceControlsAccepted" 56 #define REG_SERVICE_CHECKPOINT "dwCheckPoint" 57 #define REG_SERVICE_WAITHINT "dwWaitHint" 58 #define REG_SERVICE_EXITCODE "dwWin32ExitCode" 59 #define REG_SERVICE_SPECIFIC_EXITCODE "dwServiceSpecificExitCode" 49 60 #define REG_SERVICE_STATUS "ServiceStatus" 50 61 #define REG_SERVICE_STATUS_W (LPWSTR)L"ServiceStatus" 51 62 //This key exists if DeleteService has been called for a specific service 52 63 #define REG_SERVICE_DELETEPENDING "DeletePending" 64 65 //Win32 service can call StartServiceCtrlDispatcherA/W only once 66 static BOOL fServiceCtrlDispatcherStarted = FALSE; 53 67 54 68 //***************************************************************************** … … 96 110 return 0; 97 111 } 112 SetLastError(0); 98 113 return keyServices; 99 114 } … … 183 198 return 0; 184 199 } 200 SetLastError(0); 185 201 return keyThisService; 186 202 } … … 377 393 378 394 return (FALSE); /* signal failure */ 379 }380 381 382 /*****************************************************************************383 * Name : SetServiceStatus384 * Purpose : The SetServiceStatus function updates the service control385 * manager's status information for the calling service.386 * Parameters: SERVICE_STATUS_HANDLE sshServiceStatus service status handle387 * LPSERVICE_STATUS lpssServiceStatus address of status structure388 * Variables :389 * Result :390 * Remark :391 * Status : UNTESTED STUB392 *393 * Author : Patrick Haller [Tue, 1998/06/16 23:00]394 *****************************************************************************/395 396 BOOL WIN32API SetServiceStatus(SERVICE_STATUS_HANDLE sshServiceStatus,397 LPSERVICE_STATUS lpssServiceStatus)398 {399 dprintf(("ADVAPI32: SetServiceStatus(%08xh,%08xh) not implemented.\n",400 sshServiceStatus,401 lpssServiceStatus));402 403 if(CheckServiceHandle(sshServiceStatus) == FALSE) {404 SetLastError(ERROR_INVALID_PARAMETER);405 return FALSE;406 }407 408 return (FALSE); /* signal failure */409 }410 411 /*****************************************************************************412 * Name : QueryServiceStatus413 * Purpose : The QueryServiceStatus function retrieves the current status of414 * the specified service.415 * Parameters: SC_HANDLE schService handle of service416 * LPSERVICE_STATUS lpssServiceStatus address of service status structure417 * Variables :418 * Result :419 * Remark :420 * Status : UNTESTED STUB421 *422 * Author : Patrick Haller [Tue, 1998/06/16 23:00]423 *****************************************************************************/424 425 BOOL WIN32API QueryServiceStatus(SC_HANDLE schService,426 LPSERVICE_STATUS lpssServiceStatus)427 {428 DWORD size, keytype;429 430 dprintf(("ADVAPI32: QueryServiceStatus(%08xh,%08xh) not correctly implemented.\n",431 schService,432 lpssServiceStatus));433 434 if(CheckServiceHandle(schService) == FALSE) {435 SetLastError(ERROR_INVALID_PARAMETER);436 return FALSE;437 }438 439 memset(lpssServiceStatus, 0, sizeof(SERVICE_STATUS));440 441 size = sizeof(DWORD);442 keytype = REG_DWORD;443 RegQueryValueExA((HKEY)schService, REG_SERVICE_TYPE, 0, &keytype, (LPBYTE)&lpssServiceStatus->dwServiceType, &size);444 445 size = sizeof(DWORD);446 keytype = REG_DWORD;447 RegQueryValueExA((HKEY)schService, REG_SERVICE_STATUS, 0, &keytype, (LPBYTE)&lpssServiceStatus->dwCurrentState, &size);448 449 //TODO: Should this be set by the service once it has started?450 lpssServiceStatus->dwControlsAccepted = SERVICE_ACCEPT_STOP|SERVICE_ACCEPT_PAUSE_CONTINUE|SERVICE_ACCEPT_SHUTDOWN;451 return TRUE;452 395 } 453 396 … … 497 440 * Result : 498 441 * Remark : 499 * Status : UNTESTED STUB500 * 501 * Author : Patrick Haller [Tue, 1998/06/16 23:00]442 * Status : 443 * 444 * Author : SvL 502 445 *****************************************************************************/ 503 446 … … 549 492 * Result : 550 493 * Remark : 551 * Status : UNTESTED STUB552 * 553 * Author : Patrick Haller [Tue, 1998/06/16 23:00]494 * Status : 495 * 496 * Author : SvL 554 497 *****************************************************************************/ 555 498 … … 566 509 LPCWSTR lpDisplayName) 567 510 { 511 LPSTR lpDisplayNameA = NULL, lpBinaryPathNameA = NULL; 512 LPSTR lpDependenciesA = NULL, lpServiceStartNameA = NULL, lpPasswordA = NULL; 513 LPSTR lpLoadOrderGroupA = NULL; 514 BOOL fRc; 515 568 516 dprintf(("ADVAPI32: ChangeServiceConfigW(%08xh,%08xh,%08xh,%08xh,%s,%s,%08xh,%s,%s,%s,%s) not implemented.\n", 569 517 hService, … … 579 527 lpDisplayName)); 580 528 581 return (FALSE); /* signal failure */ 529 if(lpDisplayName) 530 lpDisplayNameA = HEAP_strdupWtoA(GetProcessHeap(), 0, lpDisplayName); 531 if(lpBinaryPathName) 532 lpBinaryPathNameA = HEAP_strdupWtoA(GetProcessHeap(), 0, lpBinaryPathName); 533 if(lpDependencies) 534 lpDependenciesA = HEAP_strdupWtoA(GetProcessHeap(), 0, lpDependencies); 535 if(lpServiceStartName) 536 lpServiceStartNameA = HEAP_strdupWtoA(GetProcessHeap(), 0, lpServiceStartName); 537 if(lpPassword) 538 lpPasswordA = HEAP_strdupWtoA(GetProcessHeap(), 0, lpPassword); 539 if(lpDisplayName) 540 lpDisplayNameA = HEAP_strdupWtoA(GetProcessHeap(), 0, lpDisplayName); 541 if(lpLoadOrderGroup) 542 lpLoadOrderGroupA = HEAP_strdupWtoA(GetProcessHeap(), 0, lpLoadOrderGroup); 543 544 fRc = ChangeServiceConfigA(hService,dwServiceType, dwStartType, dwErrorControl, 545 lpBinaryPathNameA, 546 lpLoadOrderGroupA, 547 lpdwTagId, 548 lpDependenciesA, 549 lpServiceStartNameA, 550 lpPasswordA, 551 lpDisplayNameA); 552 553 if(lpDisplayNameA) HeapFree(GetProcessHeap(), 0, lpDisplayNameA); 554 if(lpBinaryPathNameA) HeapFree(GetProcessHeap(), 0, lpBinaryPathNameA); 555 if(lpDependenciesA) HeapFree(GetProcessHeap(), 0, lpDependenciesA); 556 if(lpServiceStartNameA) HeapFree(GetProcessHeap(), 0, lpServiceStartNameA); 557 if(lpPasswordA) HeapFree(GetProcessHeap(), 0, lpPasswordA); 558 if(lpLoadOrderGroupA) HeapFree(GetProcessHeap(), 0, lpLoadOrderGroupA); 559 560 return fRc; 582 561 } 583 562 … … 593 572 * Result : 594 573 * Remark : 595 * Status : UNTESTED STUB596 * 597 * Author : Patrick Haller [Tue, 1998/06/16 23:00]574 * Status : 575 * 576 * Author : SvL 598 577 *****************************************************************************/ 599 578 … … 629 608 630 609 RegCloseKey((HKEY)hSCObject); 610 SetLastError(0); 631 611 return TRUE; 632 612 } … … 641 621 * Result : 642 622 * Remark : 643 * Status : UNTESTED STUB644 * 645 * Author : Patrick Haller [Tue, 1998/06/16 23:00]623 * Status : 624 * 625 * Author : SvL 646 626 *****************************************************************************/ 647 627 … … 660 640 return FALSE; 661 641 } 642 SetLastError(0); 662 643 return TRUE; 663 644 } … … 684 665 * Result : 685 666 * Remark : 686 * Status : UNTESTED STUB687 * 688 * Author : Patrick Haller [Tue, 1998/06/16 23:00]667 * Status : 668 * 669 * Author : SvL 689 670 *****************************************************************************/ 690 671 … … 766 747 767 748 RegCloseKey(keyServices); 749 SetLastError(0); 768 750 return keyThisService; 769 751 } … … 790 772 * Result : 791 773 * Remark : 792 * Status : UNTESTED STUB793 * 794 * Author : Patrick Haller [Tue, 1998/06/16 23:00]774 * Status : 775 * 776 * Author : SvL 795 777 *****************************************************************************/ 796 778 … … 872 854 * Result : 873 855 * Remark : 874 * Status : UNTESTED STUB875 * 876 * Author : Patrick Haller [Tue, 1998/06/16 23:00]856 * Status : 857 * 858 * Author : SvL 877 859 *****************************************************************************/ 878 860 … … 893 875 DWORD state = SERVICE_RUNNING; 894 876 if(!RegSetValueExA((HKEY)schService, REG_SERVICE_STATUS, 0, REG_DWORD, (LPBYTE)&state, sizeof(DWORD))) { 877 SetLastError(0); 895 878 return TRUE; 896 879 } 897 880 881 //TODO: Really start service 898 882 return (FALSE); /* signal failure */ 899 883 } … … 908 892 * Result : 909 893 * Remark : 910 * Status : UNTESTED STUB911 * 912 * Author : Patrick Haller [Tue, 1998/06/16 23:00]894 * Status : 895 * 896 * Author : SvL 913 897 *****************************************************************************/ 914 898 … … 929 913 DWORD state = SERVICE_RUNNING; 930 914 if(!RegSetValueExW((HKEY)schService, REG_SERVICE_STATUS_W, 0, REG_DWORD, (LPBYTE)&state, sizeof(DWORD))) { 915 SetLastError(0); 931 916 return TRUE; 932 917 } 918 //TODO: Really start service 933 919 return (FALSE); /* signal failure */ 934 920 } … … 942 928 * Result : 943 929 * Remark : 944 * Status : UNTESTED STUB945 * 946 * Author : Patrick Haller [Tue, 1998/06/16 23:00]930 * Status : 931 * 932 * Author : SvL 947 933 *****************************************************************************/ 948 934 … … 957 943 DWORD deletepending = 1; 958 944 if(!RegSetValueExA((HKEY)hService, REG_SERVICE_DELETEPENDING, 0, REG_DWORD, (LPBYTE)&deletepending, sizeof(DWORD))) { 945 SetLastError(0); 959 946 return TRUE; 960 947 } … … 974 961 * Result : 975 962 * Remark : 976 * Status : UNTESTED STUB977 * 978 * Author : Patrick Haller [Tue, 1998/06/16 23:00]963 * Status : 964 * 965 * Author : SvL 979 966 *****************************************************************************/ 980 967 … … 1016 1003 *lpcchBuffer = size; 1017 1004 RegCloseKey(keyThisService); 1005 SetLastError(0); 1018 1006 return TRUE; 1019 1007 } … … 1032 1020 * Result : 1033 1021 * Remark : 1034 * Status : UNTESTED STUB1035 * 1036 * Author : Patrick Haller [Tue, 1998/06/16 23:00]1022 * Status : 1023 * 1024 * Author : SvL 1037 1025 *****************************************************************************/ 1038 1026 … … 1074 1062 *lpcchBuffer = size; 1075 1063 RegCloseKey(keyThisService); 1064 SetLastError(0); 1076 1065 return TRUE; 1077 1066 } … … 1345 1334 } 1346 1335 1347 1348 1336 //****************************************************************************** 1337 //Helper for StartServiceCtrlDispatcherA/W; counts nr or arguments in cmd line 1338 //****************************************************************************** 1339 ULONG CountNrArgs(char *cmdline) 1340 { 1341 char *cmd = cmdline; 1342 ULONG nrargs = 0; 1343 1344 while(*cmd == ' ') cmd++; //skip leading spaces 1345 while(*cmd != 0) { 1346 while(*cmd != ' ' && *cmd != 0) cmd++; //skip non-space chars 1347 while(*cmd == ' ' && *cmd != 0) cmd++; //skip spaces 1348 nrargs++; 1349 } 1350 return nrargs; 1351 } 1349 1352 1350 1353 /***************************************************************************** … … 1357 1360 * Result : 1358 1361 * Remark : 1359 * Status : UNTESTED STUB1360 * 1361 * Author : Patrick Haller [Tue, 1998/06/16 23:00]1362 * Status : 1363 * 1364 * Author : SvL 1362 1365 *****************************************************************************/ 1363 1366 1364 1367 BOOL WIN32API StartServiceCtrlDispatcherW(LPSERVICE_TABLE_ENTRYW lpsteServiceTable) 1365 1368 { 1366 dprintf(("ADVAPI32: StartServiceCtrlDispatcherW(%08xh) not implemented.\n", 1367 lpsteServiceTable)); 1368 1369 return (FALSE); /* signal failure */ 1370 } 1371 1369 ULONG nrArgs = 0; 1370 LPWSTR cmdline; 1371 1372 dprintf(("ADVAPI32: StartServiceCtrlDispatcherW(%x)", lpsteServiceTable)); 1373 1374 if(fServiceCtrlDispatcherStarted == TRUE) { 1375 SetLastError(ERROR_SERVICE_ALREADY_RUNNING); 1376 return FALSE; 1377 } 1378 fServiceCtrlDispatcherStarted = TRUE; 1379 if(lpsteServiceTable->lpServiceProc == NULL) { 1380 SetLastError(ERROR_INVALID_DATA); //or invalid parameter? 1381 return FALSE; 1382 } 1383 while(lpsteServiceTable->lpServiceProc) { 1384 cmdline = (LPWSTR)GetCommandLineW(); 1385 nrArgs = CountNrArgs((LPSTR)GetCommandLineA()); 1386 lpsteServiceTable->lpServiceProc(nrArgs, cmdline); 1387 lpsteServiceTable++; //next service entrypoint 1388 } 1389 SetLastError(0); 1390 return TRUE; 1391 } 1372 1392 1373 1393 /***************************************************************************** … … 1380 1400 * Result : 1381 1401 * Remark : 1382 * Status : UNTESTED STUB1383 * 1384 * Author : Patrick Haller [Tue, 1998/06/16 23:00]1402 * Status : 1403 * 1404 * Author : SvL 1385 1405 *****************************************************************************/ 1386 1406 1387 1407 BOOL WIN32API StartServiceCtrlDispatcherA(LPSERVICE_TABLE_ENTRYA lpsteServiceTable) 1388 1408 { 1389 dprintf(("ADVAPI32: StartServiceCtrlDispatcherA(%08xh) not implemented.\n", 1390 lpsteServiceTable)); 1391 1409 ULONG nrArgs = 0; 1410 LPSTR cmdline; 1411 1412 dprintf(("ADVAPI32: StartServiceCtrlDispatcherA(%08xh)", lpsteServiceTable)); 1413 1414 if(fServiceCtrlDispatcherStarted == TRUE) { 1415 SetLastError(ERROR_SERVICE_ALREADY_RUNNING); 1416 return FALSE; 1417 } 1418 fServiceCtrlDispatcherStarted = TRUE; 1419 if(lpsteServiceTable->lpServiceProc == NULL) { 1420 SetLastError(ERROR_INVALID_DATA); //or invalid parameter? 1421 return FALSE; 1422 } 1423 while(lpsteServiceTable->lpServiceProc) { 1424 cmdline = (LPSTR)GetCommandLineA(); 1425 nrArgs = CountNrArgs(cmdline); 1426 lpsteServiceTable->lpServiceProc(nrArgs, cmdline); 1427 lpsteServiceTable++; //next service entrypoint 1428 } 1429 SetLastError(0); 1430 return TRUE; 1431 } 1432 1433 /***************************************************************************** 1434 * Name : RegisterServiceCtrlHandlerA 1435 * Purpose : The RegisterServiceCtrlHandler function registers a function to 1436 * handle service control requests for a service. 1437 * Parameters: LPCSTR lpszServiceName address of name of service 1438 * LPHANDLER_FUNCTION lpHandlerProc address of handler function 1439 * Variables : 1440 * Result : 1441 * Remark : 1442 * Status : 1443 * 1444 * Author : SvL 1445 *****************************************************************************/ 1446 1447 SERVICE_STATUS_HANDLE WIN32API RegisterServiceCtrlHandlerA(LPCSTR lpszServiceName, 1448 LPHANDLER_FUNCTION lpHandlerProc) 1449 { 1450 SC_HANDLE hSCMgr, hService; 1451 1452 dprintf(("ADVAPI32: RegisterServiceCtrlHandlerA(%s,%08xh) not implemented (FAKED)", 1453 lpszServiceName, 1454 lpHandlerProc)); 1455 1456 //Doesn't work for services of type 1457 if(lpszServiceName == NULL) { 1458 SetLastError(ERROR_INVALID_NAME); 1459 return 0; 1460 } 1461 hSCMgr = OpenSCManagerA(NULL, NULL, SC_MANAGER_ALL_ACCESS); 1462 hService = OpenServiceA(hSCMgr, lpszServiceName, SERVICE_ALL_ACCESS); 1463 if(hService == 0) { 1464 SetLastError(ERROR_INVALID_NAME); 1465 return 0; 1466 } 1467 CloseServiceHandle(hSCMgr); 1468 //TODO: Start thread with ctrl handler 1469 SetLastError(0); 1470 return hService; 1471 } 1472 1473 1474 /***************************************************************************** 1475 * Name : RegisterServiceCtrlHandlerW 1476 * Purpose : The RegisterServiceCtrlHandler function registers a function to 1477 * handle service control requests for a service. 1478 * Parameters: LPCWSTR lpszServiceName address of name of service 1479 * LPHANDLER_FUNCTION lpHandlerProc address of handler function 1480 * Variables : 1481 * Result : 1482 * Remark : 1483 * Status : 1484 * 1485 * Author : SvL 1486 *****************************************************************************/ 1487 1488 SERVICE_STATUS_HANDLE WIN32API RegisterServiceCtrlHandlerW(LPCWSTR lpszServiceName, 1489 LPHANDLER_FUNCTION lpHandlerProc) 1490 { 1491 SC_HANDLE hSCMgr, hService; 1492 1493 dprintf(("ADVAPI32: RegisterServiceCtrlHandlerW(%s,%08xh) not implemented (FAKED)", 1494 lpszServiceName, 1495 lpHandlerProc)); 1496 1497 //Doesn't work for services of type 1498 if(lpszServiceName == NULL) { 1499 SetLastError(ERROR_INVALID_NAME); 1500 return 0; 1501 } 1502 hSCMgr = OpenSCManagerW(NULL, NULL, SC_MANAGER_ALL_ACCESS); 1503 hService = OpenServiceW(hSCMgr, lpszServiceName, SERVICE_ALL_ACCESS); 1504 if(hService == 0) { 1505 SetLastError(ERROR_INVALID_NAME); 1506 return 0; 1507 } 1508 CloseServiceHandle(hSCMgr); 1509 //TODO: Start thread with ctrl handler 1510 SetLastError(0); 1511 return hService; 1512 } 1513 1514 /***************************************************************************** 1515 * Name : SetServiceBits 1516 * Purpose : The SetServiceBits function registers a service's service type 1517 * with the Service Control Manager and the Server service. The 1518 * Server service can then announce the registered service type 1519 * as one it currently supports. The LAN Manager functions 1520 * NetServerGetInfo and NetServerEnum obtain a specified machine's 1521 * supported service types. 1522 * A service type is represented as a set of bit flags; the 1523 * SetServiceBits function sets or clears combinations of those bit flags. 1524 * Parameters: SERVICE_STATUS_HANDLE hServiceStatus service status handle 1525 * DWORD dwServiceBits service type bits to set or clear 1526 * BOOL bSetBitsOn flag to set or clear the service type bits 1527 * BOOL bUpdateImmediately flag to announce server type immediately 1528 * Variables : 1529 * Result : 1530 * Remark : 1531 * Status : 1532 * 1533 * Author : SvL 1534 *****************************************************************************/ 1535 1536 BOOL WIN32API SetServiceBits(SERVICE_STATUS_HANDLE hServiceStatus, 1537 DWORD dwServiceBits, 1538 BOOL bSetBitsOn, 1539 BOOL bUpdateImmediately) 1540 { 1541 ULONG size, keytype, servicebits; 1542 1543 dprintf(("ADVAPI32: SetServiceBits(%08xh,%08xh,%08xh,%08xh) not correctly implemented", 1544 hServiceStatus, 1545 dwServiceBits, 1546 bSetBitsOn, 1547 bUpdateImmediately)); 1548 1549 if(CheckServiceHandle(hServiceStatus) == FALSE) { 1550 SetLastError(ERROR_INVALID_PARAMETER); 1551 return FALSE; 1552 } 1553 //According to the Platform SDK these bits are reserved by MS and we should return 1554 //ERROR_INVALID_DATA 1555 if(dwServiceBits & 0xC00F3F7B) { 1556 SetLastError(ERROR_INVALID_DATA); 1557 return FALSE; 1558 } 1559 1560 size = sizeof(DWORD); 1561 keytype = REG_DWORD; 1562 if(RegQueryValueExA((HKEY)hServiceStatus, REG_SERVICE_BITS, 0, &keytype, (LPBYTE)&servicebits, &size)) { 1563 servicebits = 0; 1564 } 1565 if(bSetBitsOn) { 1566 servicebits |= dwServiceBits; 1567 } 1568 else servicebits &= (~dwServiceBits); 1569 1570 if(!RegSetValueExA((HKEY)hServiceStatus, REG_SERVICE_BITS, 0, REG_DWORD, (LPBYTE)&servicebits, sizeof(DWORD))) { 1571 SetLastError(0); 1572 return TRUE; 1573 } 1392 1574 return (FALSE); /* signal failure */ 1393 1575 } 1394 1576 1395 1577 /***************************************************************************** 1578 * Name : SetServiceStatus 1579 * Purpose : The SetServiceStatus function updates the service control 1580 * manager's status information for the calling service. 1581 * Parameters: SERVICE_STATUS_HANDLE sshServiceStatus service status handle 1582 * LPSERVICE_STATUS lpssServiceStatus address of status structure 1583 * Variables : 1584 * Result : 1585 * Remark : Called from ServiceMain function (registered with RegisterServiceCtrlHandler) 1586 * Status : 1587 * 1588 * Author : SvL 1589 *****************************************************************************/ 1590 1591 BOOL WIN32API SetServiceStatus(SERVICE_STATUS_HANDLE sshServiceStatus, 1592 LPSERVICE_STATUS lpssServiceStatus) 1593 { 1594 dprintf(("ADVAPI32: SetServiceStatus(%08xh,%08xh) not implemented correctly.\n", 1595 sshServiceStatus, 1596 lpssServiceStatus)); 1597 1598 if(CheckServiceHandle(sshServiceStatus) == FALSE) { 1599 SetLastError(ERROR_INVALID_PARAMETER); 1600 return FALSE; 1601 } 1602 1603 RegSetValueExA((HKEY)sshServiceStatus, REG_SERVICE_TYPE, 0, REG_DWORD, (LPBYTE)&lpssServiceStatus->dwServiceType, sizeof(DWORD)); 1604 RegSetValueExA((HKEY)sshServiceStatus, REG_SERVICE_STATUS, 0, REG_DWORD, (LPBYTE)&lpssServiceStatus->dwCurrentState, sizeof(DWORD)); 1605 RegSetValueExA((HKEY)sshServiceStatus, REG_SERVICE_CONTROLS_ACCEPTED, 0, REG_DWORD, (LPBYTE)&lpssServiceStatus->dwControlsAccepted, sizeof(DWORD)); 1606 1607 RegSetValueExA((HKEY)sshServiceStatus, REG_SERVICE_EXITCODE, 0, REG_DWORD, (LPBYTE)&lpssServiceStatus->dwWin32ExitCode, sizeof(DWORD)); 1608 RegSetValueExA((HKEY)sshServiceStatus, REG_SERVICE_SPECIFIC_EXITCODE, 0, REG_DWORD, (LPBYTE)&lpssServiceStatus->dwServiceSpecificExitCode, sizeof(DWORD)); 1609 1610 RegSetValueExA((HKEY)sshServiceStatus, REG_SERVICE_CHECKPOINT, 0, REG_DWORD, (LPBYTE)&lpssServiceStatus->dwCheckPoint, sizeof(DWORD)); 1611 RegSetValueExA((HKEY)sshServiceStatus, REG_SERVICE_WAITHINT, 0, REG_DWORD, (LPBYTE)&lpssServiceStatus->dwWaitHint, sizeof(DWORD)); 1612 1613 SetLastError(0); 1614 return TRUE; 1615 } 1616 1617 /***************************************************************************** 1618 * Name : QueryServiceStatus 1619 * Purpose : The QueryServiceStatus function retrieves the current status of 1620 * the specified service. 1621 * Parameters: SC_HANDLE schService handle of service 1622 * LPSERVICE_STATUS lpssServiceStatus address of service status structure 1623 * Variables : 1624 * Result : 1625 * Remark : 1626 * Status : 1627 * 1628 * Author : SvL 1629 *****************************************************************************/ 1630 1631 BOOL WIN32API QueryServiceStatus(SC_HANDLE schService, 1632 LPSERVICE_STATUS lpssServiceStatus) 1633 { 1634 DWORD size, keytype; 1635 1636 dprintf(("ADVAPI32: QueryServiceStatus(%08xh,%08xh) not correctly implemented.\n", 1637 schService, 1638 lpssServiceStatus)); 1639 1640 if(CheckServiceHandle(schService) == FALSE) { 1641 SetLastError(ERROR_INVALID_PARAMETER); 1642 return FALSE; 1643 } 1644 1645 memset(lpssServiceStatus, 0, sizeof(SERVICE_STATUS)); 1646 1647 size = sizeof(DWORD); 1648 keytype = REG_DWORD; 1649 RegQueryValueExA((HKEY)schService, REG_SERVICE_TYPE, 0, &keytype, (LPBYTE)&lpssServiceStatus->dwServiceType, &size); 1650 1651 size = sizeof(DWORD); 1652 keytype = REG_DWORD; 1653 RegQueryValueExA((HKEY)schService, REG_SERVICE_STATUS, 0, &keytype, (LPBYTE)&lpssServiceStatus->dwCurrentState, &size); 1654 1655 size = sizeof(DWORD); 1656 keytype = REG_DWORD; 1657 RegQueryValueExA((HKEY)schService, REG_SERVICE_CONTROLS_ACCEPTED, 0, &keytype, (LPBYTE)&lpssServiceStatus->dwControlsAccepted, &size); 1658 1659 size = sizeof(DWORD); 1660 keytype = REG_DWORD; 1661 RegQueryValueExA((HKEY)schService, REG_SERVICE_EXITCODE, 0, &keytype, (LPBYTE)&lpssServiceStatus->dwWin32ExitCode, &size); 1662 1663 size = sizeof(DWORD); 1664 keytype = REG_DWORD; 1665 RegQueryValueExA((HKEY)schService, REG_SERVICE_SPECIFIC_EXITCODE, 0, &keytype, (LPBYTE)&lpssServiceStatus->dwServiceSpecificExitCode, &size); 1666 1667 size = sizeof(DWORD); 1668 keytype = REG_DWORD; 1669 RegQueryValueExA((HKEY)schService, REG_SERVICE_CHECKPOINT, 0, &keytype, (LPBYTE)&lpssServiceStatus->dwCheckPoint, &size); 1670 1671 size = sizeof(DWORD); 1672 keytype = REG_DWORD; 1673 RegQueryValueExA((HKEY)schService, REG_SERVICE_WAITHINT, 0, &keytype, (LPBYTE)&lpssServiceStatus->dwWaitHint, &size); 1674 1675 SetLastError(0); 1676 return TRUE; 1677 }
Note:
See TracChangeset
for help on using the changeset viewer.