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

📄 wince.c

📁 2410下
💻 C
字号:
//
// Copyright (c) Microsoft Corporation.  All rights reserved.
//
//
// Use of this source code is subject to the terms of the Microsoft end-user
// license agreement (EULA) under which you licensed this SOFTWARE PRODUCT.
// If you did not accept the terms of the EULA, you are not authorized to use
// this source code. For a copy of the EULA, please see the LICENSE.RTF on your
// install media.
//
/*++
THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF
ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO
THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A
PARTICULAR PURPOSE.

Module Name:  

wince.c

Abstract:  

Windows CE specific functions for the CS8900A NDIS miniport driver.

Functions:
    DllEntry
    AddKeyValues
    Install_Driver

Notes: 


--*/
#include <windows.h>
#include <ndis.h>
#include <cardserv.h>
#include <cardapi.h>
#include <tuple.h>

#ifdef DEBUG

//
// These defines must match the ZONE_* defines in NE2000SW.H
//
#define DBG_ERROR      1
#define DBG_WARN       2
#define DBG_FUNCTION   4
#define DBG_INIT       8
#define DBG_INTR       16
#define DBG_RCV        32
#define DBG_XMIT       64

#define ZONE_INIT		DEBUGZONE(0)


DBGPARAM dpCurSettings = {
    TEXT("CS8900A"), {
    TEXT("Errors"),TEXT("Warnings"),TEXT("Functions"),TEXT("Init"),
    TEXT("Interrupts"),TEXT("Receives"),TEXT("Transmits"),TEXT("Undefined"),
    TEXT("Undefined"),TEXT("Undefined"),TEXT("Undefined"),TEXT("Undefined"),
    TEXT("Undefined"),TEXT("Undefined"),TEXT("Undefined"),TEXT("Undefined") },
    DBG_INIT
};
#endif  // DEBUG

typedef struct _REG_VALUE_DESCR {
    LPWSTR val_name;
    DWORD  val_type;
    PBYTE  val_data;
} REG_VALUE_DESCR, * PREG_VALUE_DESCR;




// Values for [HKEY_LOCAL_MACHINE\Comm\CS8900A]
// and [HKEY_LOCAL_MACHINE\Comm\CS8900A1]
REG_VALUE_DESCR CommKeyValues[] = {
   (TEXT("DisplayName")), REG_SZ, (PBYTE)(TEXT("CS8900A Ethernet Driver")),
   (TEXT("Group")), REG_SZ, (PBYTE)(TEXT("NDIS")),
   (TEXT("ImagePath")), REG_SZ, (PBYTE)(TEXT("CS8900A.dll")),
    NULL, 0, NULL
};

/*
   "BusNumber"=dword:0
   "BusType"=dword:1
   "DuplexMode"=dword:1
   "MACAddress1"=dword:0000
   "MACAddress2"=dword:0000
   "MACAddress3"=dword:0000
*/
// Values for [HKEY_LOCAL_MACHINE\Comm\CS8900A1\Parms]
REG_VALUE_DESCR ParmKeyValues[] = {
   (TEXT("BusNumber")), REG_DWORD, (PBYTE)0,
   (TEXT("BusType")), REG_DWORD, (PBYTE)1,
   (TEXT("DuplexMode")), REG_DWORD, (PBYTE)1,
   (TEXT("MACAddress1")), REG_DWORD, (PBYTE)0, 
   (TEXT("MACAddress2")), REG_DWORD, (PBYTE)0, 
   (TEXT("MACAddress3")), REG_DWORD, (PBYTE)0, 
    NULL, 0, NULL
};

// Values for [HKEY_LOCAL_MACHINE\Comm\CS8900A1]
REG_VALUE_DESCR LinkageKeyValues[] = {
   (TEXT("Route")), REG_MULTI_SZ, (PBYTE)(TEXT("CS8900A1\0")),
    NULL, 0, NULL
};

PREG_VALUE_DESCR Values[] = {
    CommKeyValues,
    CommKeyValues,
    ParmKeyValues,
    LinkageKeyValues
};

LPWSTR KeyNames[] = {
    (TEXT("Comm\\CS8900A")),
    (TEXT("Comm\\CS8900A1")),
    (TEXT("Comm\\CS8900A1\\Parms")),
    (TEXT("Comm\\CS8900A\\Linkage"))
};


//
// Standard Windows DLL entrypoint.
// Since Windows CE NDIS miniports are implemented as DLLs, a DLL entrypoint is
// needed.
//
BOOL __stdcall
DllEntry(
  HANDLE hDLL,
  DWORD dwReason,
  LPVOID lpReserved
)
{

    switch (dwReason) {
    case DLL_PROCESS_ATTACH:
        DEBUGREGISTER(hDLL);
        DEBUGMSG(ZONE_INIT, (TEXT("CS8900A: DLL_PROCESS_ATTACH\n")));
    	DisableThreadLibraryCalls((HMODULE) hDLL);
        break;
    case DLL_PROCESS_DETACH:
        DEBUGMSG(ZONE_INIT, (TEXT("CS8900A: DLL_PROCESS_DETACH\n")));
        break;
    }
    return TRUE;
}

//
// Add the specified key and its values to the registry under HKEY_LOCAL_MACHINE
//
BOOL
AddKeyValues(
    LPWSTR KeyName,
    PREG_VALUE_DESCR Vals
    )
{
    DWORD Status;
    DWORD dwDisp;
    HKEY hKey;
    PREG_VALUE_DESCR pValue;
    DWORD ValLen;
    PBYTE pVal;
    DWORD dwVal;
    LPWSTR pStr;

    Status = RegCreateKeyEx(
                 HKEY_LOCAL_MACHINE,
                 KeyName,
                 0,
                 NULL,
                 REG_OPTION_NON_VOLATILE,
                 0,
                 NULL,
                 &hKey,
                 &dwDisp);

    if (Status != ERROR_SUCCESS) {
        return FALSE;
    }

    pValue = Vals;
    while (pValue->val_name) {
        switch (pValue->val_type) {
        case REG_DWORD:
            pVal = (PBYTE)&dwVal;
            dwVal = (DWORD)pValue->val_data;
            ValLen = sizeof(DWORD);
            break;

        case REG_SZ:
            pVal = (PBYTE)pValue->val_data;
            ValLen = (wcslen((LPWSTR)pVal) + 1)*sizeof(WCHAR);
            break;

        case REG_MULTI_SZ:
            pStr = (LPWSTR)pValue->val_data;
            dwVal = 0;
            while (*pStr) {
                dwDisp += wcslen(pStr) + 1;
                dwVal += dwDisp;
                pStr += dwDisp;
            }
            dwVal++;

            ValLen = dwVal*sizeof(WCHAR);
            pVal = pValue->val_data;
            break;
        }
        Status = RegSetValueEx(
                     hKey,
                     pValue->val_name,
                     0,
                     pValue->val_type,
                     pVal,
                     ValLen
                     );
        if (Status != ERROR_SUCCESS) {
            RegCloseKey(hKey);
            return FALSE;
        }
        pValue++;
    }
    RegCloseKey(hKey);
    return TRUE;
}   // AddKeyValues




⌨️ 快捷键说明

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