驱动程序: // 此驱动功能是保存一个字符串。 #include <windows.h> #include <tchar.h> #include <string.h> #define BUFSIZE 256 WCHAR achBuffer[BUFSIZE]; BOOL WINAPI DllEntryPoint ( HANDLE hinstDLL, DWORD dwReason, LPVOID lpvReserved) { switch (dwReason) { case DLL_PROCESS_ATTACH: RETAILMSG(1,(TEXT("ADC:DLL_PROCESS_ATTACH/t/n"))); return TRUE; case DLL_THREAD_ATTACH: RETAILMSG(1,(TEXT("ADC:DLL_THREAD_ATTACH/t/n"))); break; case DLL_THREAD_DETACH: RETAILMSG(1,(TEXT("ADC:DLL_THREAD_DETACH/t/n"))); break; case DLL_PROCESS_DETACH: RETAILMSG(1,(TEXT("ADC:DLL_PROCESS_DETACH/t/n"))); break; #ifdef UNDER_CE case DLL_PROCESS_EXITING: RETAILMSG(1,(TEXT("ADC:DLL_PROCESS_EXITING/t/n"))); break; case DLL_SYSTEM_STARTED: RETAILMSG(1,(TEXT("ADC:DLL_SYSTEM_STARTED/t/n"))); break; default: break; #endif } return TRUE; } DWORD STR_Init(DWORD dwContext) { DWORD dwReturn = 0; RETAILMSG (1,(TEXT("MYSTRINGS:STR_Init/t/n"))); memset (achBuffer,0,BUFSIZE * sizeof (WCHAR)); dwReturn = 1; return dwReturn; } BOOL STR_Deinit(DWORD hDeviceContext) { BOOL bReturn = TRUE; RETAILMSG(1,(TEXT("MYSTRINGS:STR_Deinit/t/n"))); return bReturn; } DWORD STR_Open (DWORD hDeviceContext, DWORD AccessCode, DWORD ShareMode) { DWORD dwReturn = 0; RETAILMSG (1,(TEXT("MYSTRINGS:STR_Open/t/n"))); dwReturn = 1; return dwReturn; } BOOL STR_Close(DWORD hOpenContext) { BOOL bReturn = TRUE; RETAILMSG(1,(TEXT("MYSTRINGS:STR_Close/t/n"))); return bReturn; } BOOL STR_IOControl(DWORD hOpenContext, DWORD dwCode, PBYTE pBufIn, DWORD dwLenIn, PBYTE pBufOut, DWORD dwLenOut, PDWORD pdwActualOut) { BOOL bReturn = TRUE; RETAILMSG(1,(TEXT("MYSTRINGS:STR_IOControl/t/n"))); return bReturn; } void STR_PowerDown (DWORD hDeviceContext) { RETAILMSG(1,(TEXT("MYSTRINGS:STR_PowerDown/t/n"))); } void STR_PowerUp(DWORD hDeviceContext) { RETAILMSG(1,(TEXT("MYSTRINGS:STR_PowerUp/t/n"))); } DWORD STR_Read(DWORD hOpenContext, LPVOID pBuffer, DWORD Count) { DWORD dwReturn = 0; //RETAILMSG(1,(TEXT("MYSTRINGS:STR_PowerUp/t/n"))); DWORD dwBuffer = wcslen(achBuffer); dwReturn = min(dwBuffer, Count); wcsncpy((LPWSTR)pBuffer, achBuffer, dwReturn); return dwReturn; } DWORD STR_Seek(DWORD hOpenContext, long Amount, DWORD Type) { DWORD dwReturn =0; RETAILMSG(1,(TEXT("MYSTRINGS:STR_Seek/t/n"))); return dwReturn; } DWORD STR_Write(DWORD hOpenContext, LPCVOID pSourcdBytes, DWORD NumberOfBytes) { DWORD dwReturn =0; RETAILMSG(1,(TEXT("MYSTRINGS:STR_Write/t/n"))); dwReturn = min(BUFSIZE, NumberOfBytes); wcsncpy (achBuffer, (LPWSTR) pSourcdBytes, dwReturn); return dwReturn; } 驱动程序注册表部分: [HKEY_LOCAL_MACHINE/Drivers/BuiltIn/STRINGS] "Index"=dword:1 "Prefix"="STR" "Dll"="String.dll" "Order"=dword:0 调用这个驱动程序: #include <windows.h> #include "StdAfx.h" #define BUFFER_SIZE 256 // The buffer size is the same as the driver's buffer size int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpCmdLine, int nCmdShow) { // Open the STRINGS driver with READ and WRITE access // --------------------------------------------------------------------- HANDLE hStr = CreateFile(TEXT("STR1:"), GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, 0, 0); if (INVALID_HANDLE_VALUE == hStr) { MessageBox(NULL, _T("Cannot open STR1:"), _T("StringApp"), MB_OK); return 0; } // Write a string to the driver. // --------------------------------------------------------------------- DWORD dwWritten = 0; WCHAR* pString = TEXT("This is a test of the String Driver. This is only a test"); WriteFile(hStr, pString, (_tcslen(pString)+1), &dwWritten, NULL); // Read string from driver. // --------------------------------------------------------------------- WCHAR wch[BUFFER_SIZE]; DWORD dwBytesRead = BUFFER_SIZE; memset(&wch, '/0', BUFFER_SIZE * sizeof(WCHAR)); ReadFile(hStr, wch, sizeof(wch), &dwBytesRead, NULL); MessageBox(NULL, wch, TEXT("StringApp"), MB_OK); // Disconnect from driver. // --------------------------------------------------------------------- CloseHandle(hStr); return 0; }