📄 ticksrv.cpp
字号:
//======================================================================
// TickSrv - Simple example service for Windows CE
//
// Written for the book Programming Windows CE
// Copyright (C) 2003 Douglas Boling
//======================================================================
#include <windows.h> // For all that Windows stuff
#include <winsock.h> // Socket support
#include "service.h" // Service includes
#include "TickSrv.h" // Local program includes
#define REGNAME TEXT("TickSrv") // Reg name under services key
#define PORTNUM 1000 // Port number to monitor
//
// Globals
//
HINSTANCE hInst; // DLL instance handle
//
// Debug zone support
//
#ifdef DEBUG
// Used as a prefix string for all debug zone messages.
#define DTAG TEXT ("TickSrv: ")
// Debug zone constants
#define ZONE_ERROR DEBUGZONE(0)
#define ZONE_WARNING DEBUGZONE(1)
#define ZONE_FUNC DEBUGZONE(2)
#define ZONE_INIT DEBUGZONE(3)
#define ZONE_DRVCALLS DEBUGZONE(4)
#define ZONE_IOCTLS DEBUGZONE(5)
#define ZONE_THREAD DEBUGZONE(6)
#define ZONE_EXENTRY (ZONE_FUNC | ZONE_DRVCALLS)
// Debug zone structure
DBGPARAM dpCurSettings = {
TEXT("TickSrv"), {
TEXT("Errors"),TEXT("Warnings"),TEXT("Functions"),
TEXT("Init"),TEXT("Driver Calls"),TEXT("Undefined"),
TEXT("IOCtls"),TEXT("Thread"), TEXT("Undefined"),
TEXT("Undefined"),TEXT("Undefined"),TEXT("Undefined"),
TEXT("Undefined"),TEXT("Undefined"),TEXT("Undefined"),
TEXT("Undefined") },
0x0003
};
#endif //DEBUG
//======================================================================
// DllMain - DLL initialization entry point
//
BOOL WINAPI DllMain (HANDLE hinstDLL, DWORD dwReason,
LPVOID lpvReserved) {
hInst = (HINSTANCE)hinstDLL;
switch (dwReason) {
case DLL_PROCESS_ATTACH:
DEBUGREGISTER(hInst);
// Improve performance by passing on thread attach calls
DisableThreadLibraryCalls (hInst);
break;
case DLL_PROCESS_DETACH:
DEBUGMSG(ZONE_INIT, (DTAG TEXT("DLL_PROCESS_DETACH\r\n")));
break;
}
return TRUE;
}
//======================================================================
// TCK_Init - Driver initialization function
//
DWORD TCK_Init (DWORD dwContext) {
PSRVCONTEXT pSrv;
DEBUGMSG (ZONE_INIT | ZONE_EXENTRY,
(DTAG TEXT("TCK_Init++ dwContext:%x\r\n"), dwContext));
// Init WinSock
WSADATA wsaData;
WSAStartup(0x101,&wsaData);
// Allocate a drive instance structure.
pSrv = (PSRVCONTEXT)LocalAlloc (LPTR, sizeof (SRVCONTEXT));
if (pSrv) {
// Initialize structure.
memset ((PBYTE) pSrv, 0, sizeof (SRVCONTEXT));
pSrv->dwSize = sizeof (SRVCONTEXT);
pSrv->servState = SERVICE_STATE_UNKNOWN;
InitializeCriticalSection (&pSrv->csData);
switch (dwContext) {
case SERVICE_INIT_STARTED:
pSrv->servState = SERVICE_STATE_ON;
break;
case SERVICE_INIT_STOPPED:
pSrv->servState = SERVICE_STATE_OFF;
break;
case SERVICE_INIT_STANDALONE:
break;
default:
break;
}
} else
DEBUGMSG (ZONE_INIT | ZONE_ERROR,
(DTAG TEXT("TCK_Init failure. Out of memory\r\n")));
DEBUGMSG (ZONE_FUNC, (DTAG TEXT("TCK_Init-- pSrv: %x\r\n"), pSrv));
return (DWORD)pSrv;
}
//======================================================================
// TCK_Deinit - Driver de-initialization function
//
BOOL TCK_Deinit (DWORD dwContext) {
PSRVCONTEXT pSrv = (PSRVCONTEXT) dwContext;
DEBUGMSG (ZONE_EXENTRY,
(DTAG TEXT("TCK_Deinit++ dwContex:%x\r\n"), dwContext));
if (pSrv && (pSrv->dwSize == sizeof (SRVCONTEXT))) {
// Free the driver state buffer.
LocalFree ((PBYTE)pSrv);
}
DEBUGMSG (ZONE_FUNC, (DTAG TEXT("TCK_Deinit--\r\n")));
return TRUE;
}
//======================================================================
// TCK_IOControl - Called when DeviceIOControl called
// ServiceEnumInfo
DWORD TCK_IOControl (DWORD dwOpen, DWORD dwCode, PBYTE pIn, DWORD dwIn,
PBYTE pOut, DWORD dwOut, DWORD *pdwBytesWritten) {
PSRVCONTEXT pSrv;
DWORD err = ERROR_INVALID_PARAMETER;
pSrv = (PSRVCONTEXT) dwOpen;
DEBUGMSG (ZONE_EXENTRY,
(DTAG TEXT("TCK_IOControl++ dwOpen: %x dwCode: %x %d\r\n"),
dwOpen, dwCode, pSrv->servState));
switch (dwCode) {
// -------------
// Commands
// -------------
// Cmd to start service
case IOCTL_SERVICE_START:
DEBUGMSG (ZONE_IOCTLS, (DTAG TEXT("IOCTL_SERVICE_START\r\n")));
EnterCriticalSection (&pSrv->csData);
if ((pSrv->servState == SERVICE_STATE_OFF) |
(pSrv->servState == SERVICE_STATE_UNKNOWN)) {
pSrv->servState = SERVICE_STATE_ON;
err = 0;
} else
err = ERROR_SERVICE_ALREADY_RUNNING;
LeaveCriticalSection (&pSrv->csData);
break;
// Cmd to stop service
case IOCTL_SERVICE_STOP:
DEBUGMSG (ZONE_IOCTLS, (DTAG TEXT("IOCTL_SERVICE_STOP\r\n")));
EnterCriticalSection (&pSrv->csData);
if ((pSrv->servState == SERVICE_STATE_ON)) {
pSrv->servState = SERVICE_STATE_SHUTTING_DOWN;
} else
err = ERROR_SERVICE_NOT_ACTIVE;
LeaveCriticalSection (&pSrv->csData);
break;
//Reread service reg setting
case IOCTL_SERVICE_REFRESH:
DEBUGMSG (ZONE_IOCTLS, (DTAG TEXT("IOCTL_SERVICE_REFRESH\r\n")));
// No settings in example service to read
break;
//Config registry for auto load on boot
case IOCTL_SERVICE_INSTALL:
DEBUGMSG (ZONE_IOCTLS, (DTAG TEXT("IOCTL_SERVICE_INSTALL\r\n")));
err = RegisterService();
break;
//Clear registry of auto load stuff
case IOCTL_SERVICE_UNINSTALL:
DEBUGMSG (ZONE_IOCTLS, (DTAG TEXT("IOCTL_SERVICE_UNINSTALL\r\n")));
err = DeregisterService();
break;
//Clear registry of auto load stuff
case IOCTL_SERVICE_CONTROL:
DEBUGMSG (ZONE_IOCTLS, (DTAG TEXT("IOCTL_SERVICE_CONTROL\r\n")));
err = 0;
break;
#ifdef DEBUG
// Set debug zones
case IOCTL_SERVICE_DEBUG:
DEBUGMSG (ZONE_IOCTLS, (DTAG TEXT("IOCTL_SERVICE_DEBUG\r\n")));
if (!pIn || (dwIn < sizeof (DWORD)))
break;
__try {
dpCurSettings.ulZoneMask = *(DWORD *)pIn;
err = 0;
}
__except (EXCEPTION_EXECUTE_HANDLER) {
;
}
#endif
// -------------
// Queries
// -------------
// Query for current service state
case IOCTL_SERVICE_STATUS:
DEBUGMSG (ZONE_IOCTLS, (DTAG TEXT("IOCTL_SERVICE_STATUS\r\n")));
if (!pOut || (dwOut < sizeof (DWORD)))
break;
__try {
*(DWORD *)pOut = pSrv->servState;
if (pdwBytesWritten)
*pdwBytesWritten = sizeof (DWORD);
err = 0;
}
__except (EXCEPTION_EXECUTE_HANDLER) {
;
}
break;
// Query for unload.
case IOCTL_SERVICE_QUERY_CAN_DEINIT:
DEBUGMSG (ZONE_IOCTLS,
(DTAG TEXT("IOCTL_SERVICE_QUERY_CAN_DEINIT\r\n")));
if (!pOut || (dwOut < sizeof (DWORD)))
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -