#include <stdio.h>
#define WIN32_NO_STATUS
#include <windows.h>
+#include <netevent.h>
#define NTOS_MODE_USER
#include <ndk/ntndk.h>
#include <services/services.h>
typedef struct _SERVICE_IMAGE
{
- DWORD dwServiceRefCount; // Number of running services of this image
- DWORD Dummy;
+ LIST_ENTRY ImageListEntry;
+ DWORD dwImageRunCount;
+
+ HANDLE hControlPipe;
+ HANDLE hProcess;
+ DWORD dwProcessId;
+
+ WCHAR szImagePath[1];
} SERVICE_IMAGE, *PSERVICE_IMAGE;
DWORD dwResumeCount;
DWORD dwRefCount;
- CLIENT_HANDLE hClient;
SERVICE_STATUS Status;
DWORD dwStartType;
DWORD dwErrorControl;
BOOLEAN ServiceVisited;
- HANDLE ControlPipeHandle;
- ULONG ProcessId;
- ULONG ThreadId;
-
WCHAR szServiceName[1];
} SERVICE, *PSERVICE;
extern LIST_ENTRY ServiceListHead;
extern LIST_ENTRY GroupListHead;
+extern LIST_ENTRY ImageListHead;
extern BOOL ScmShutdown;
PSERVICE ScmGetServiceEntryByName(LPCWSTR lpServiceName);
PSERVICE ScmGetServiceEntryByDisplayName(LPCWSTR lpDisplayName);
PSERVICE ScmGetServiceEntryByResumeCount(DWORD dwResumeCount);
-PSERVICE ScmGetServiceEntryByClientHandle(HANDLE Handle);
DWORD ScmCreateNewServiceRecord(LPCWSTR lpServiceName,
PSERVICE *lpServiceRecord);
VOID ScmDeleteServiceRecord(PSERVICE lpService);
DWORD ScmMarkServiceForDelete(PSERVICE pService);
DWORD ScmControlService(PSERVICE Service,
- DWORD dwControl,
- LPSERVICE_STATUS lpServiceStatus);
+ DWORD dwControl);
+
+BOOL ScmLockDatabaseExclusive(VOID);
+BOOL ScmLockDatabaseShared(VOID);
+VOID ScmUnlockDatabase(VOID);
+
+VOID ScmInitNamedPipeCriticalSection(VOID);
+VOID ScmDeleteNamedPipeCriticalSection(VOID);
+
/* driver.c */
/* services.c */
VOID PrintString(LPCSTR fmt, ...);
+VOID ScmLogError(DWORD dwEventId,
+ WORD wStrings,
+ LPCWSTR *lpStrings);
/* EOF */