⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ticksrv.cpp

📁 《Windows CE 6.0开发者参考》(《Programming Windows Embedded CE 6.0 Developer Reference》)第四版书中的源代码
💻 CPP
📖 第 1 页 / 共 2 页
字号:
//======================================================================
// TickSrv - Simple example service for Windows CE
//
// Written for the book Programming Windows CE
// Copyright (C) 2007 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

// This links in the Winsock library without having to adjust the 
// project settings.
#pragma comment( lib, "ws2" )        // Link WinSock 2.0 lib

#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("Service 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 - Service 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;
        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 - Service 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 Service state buffer.
        LocalFree ((PBYTE)pSrv);
    }
    DEBUGMSG (ZONE_FUNC, (DTAG TEXT("TCK_Deinit--\r\n")));
    return TRUE;
}
//======================================================================
// TCK_Open - Service Open function
//
DWORD TCK_Open (DWORD dwContext, DWORD dwAccess, DWORD dwShare) {
    PSRVCONTEXT pSrv = (PSRVCONTEXT) dwContext;

    DEBUGMSG (ZONE_EXENTRY, 
              (DTAG TEXT("TCK_Open++ dwContex:%x\r\n"), dwContext));

    DEBUGMSG (ZONE_FUNC, (DTAG TEXT("TCK_Open--\r\n")));
    return (DWORD)pSrv;
}
//======================================================================
// TCK_Close - Service Close function
//
BOOL TCK_Close (DWORD dwContext) {
    PSRVCONTEXT pSrv = (PSRVCONTEXT) dwContext;

    DEBUGMSG (ZONE_EXENTRY, 
              (DTAG TEXT("TCK_Close++ dwContex:%x\r\n"), dwContext));

    DEBUGMSG (ZONE_FUNC, (DTAG TEXT("TCK_Close--\r\n")));
    return 0;
}
//======================================================================
// 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;
    HANDLE hThrd;
    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;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -