#include #include "debug.h" #include "stringutils.h" #include "args.h" #include "kernelmisc.h" // prun -o 0x50000000 -l 0x0dc00000 -w x.nb // prun -o 0x50000000 -l 0x10000000 -s 0x00100000 -c 0x100 typedef DWORD (*PFNInit)( DWORD dwContext); typedef BOOL (*PFNDeinit)( DWORD dwContext); typedef BOOL (*PFNClose)( DWORD Handle); //BOOL WINAPI CloseHandle( HANDLE hObject); typedef DWORD (*PFNOpen)( DWORD dwData, DWORD dwAccess, DWORD dwShareMode); //HANDLE WINAPI CreateFile( LPCTSTR lpFileName, DWORD dwDesiredAccess, DWORD dwShareMode, LPSECURITY_ATTRIBUTES lpSecurityAttributes, DWORD dwCreationDisposition, DWORD dwFlagsAndAttributes, HANDLE hTemplateFile); typedef BOOL (*PFNIOControl)( DWORD Handle, DWORD dwIoControlCode, PBYTE pInBuf, DWORD nInBufSize, PBYTE pOutBuf, DWORD nOutBufSize, PDWORD pBytesReturned); //BOOL DeviceIoControl( HANDLE hDevice, DWORD dwIoControlCode, LPVOID lpInBuffer, DWORD nInBufferSize, LPVOID lpOutBuffer, DWORD nOutBufferSize, LPDWORD lpBytesReturned, LPOVERLAPPED lpOverlapped); typedef DWORD (*PFNRead)(DWORD Handle, LPVOID pBuffer, DWORD dwNumBytes); //BOOL WINAPI ReadFile( HANDLE hFile, LPVOID lpBuffer, DWORD nNumberOfBytesToRead, LPDWORD lpNumberOfBytesRead, LPOVERLAPPED lpOverlapped); typedef DWORD (*PFNWrite)(DWORD Handle, LPCVOID pBuffer, DWORD dwNumBytes); //BOOL WINAPI WriteFile( HANDLE hFile, LPCVOID lpBuffer, DWORD nNumberOfBytesToWrite, LPDWORD lpNumberOfBytesWritten, LPOVERLAPPED lpOverlapped); typedef DWORD (*PFNSeek)(DWORD Handle, long lDistance, DWORD dwMoveMethod); //DWORD WINAPI SetFilePointer( HANDLE hFile, LONG lDistanceToMove, PLONG lpDistanceToMoveHigh, DWORD dwMoveMethod); typedef void (*PFNPowerUp)(void); typedef void (*PFNPowerDown)(void); PFNInit DrvInit; PFNClose DrvClose; PFNDeinit DrvDeinit; PFNOpen DrvOpen; PFNIOControl DrvIOControl; PFNRead DrvRead; PFNWrite DrvWrite; PFNSeek DrvSeek; PFNPowerUp DrvPowerUp; PFNPowerDown DrvPowerDown; BOOL ReadRegistryString(HKEY hRoot, LPTSTR devicekey, LPTSTR valname, TCHAR *strval, int maxlen) { HKEY hDevkey; DWORD rc= RegOpenKeyEx(hRoot, devicekey, 0, 0, &hDevkey); if (rc) { debug("RegOpenKeyEx(%ls): ERROR %08lx\n", devicekey, rc); return FALSE; } DWORD valtype=0; DWORD maxsize= sizeof(TCHAR)*(maxlen-1); rc= RegQueryValueEx(hDevkey, valname, NULL, &valtype, (LPBYTE)strval, &maxsize); if (rc) { debug("RegQueryValueEx(%ls, target): ERROR %08lx\n", devicekey, rc); RegCloseKey(hDevkey); return FALSE; } strval[maxlen-1]=0; RegCloseKey(hDevkey); return TRUE; } BOOL ReadRegistryDword(HKEY hRoot, LPTSTR devicekey, LPTSTR valname, DWORD *pvalue) { HKEY hDevkey; DWORD rc= RegOpenKeyEx(hRoot, devicekey, 0, 0, &hDevkey); if (rc) { debug("RegOpenKeyEx(%ls): ERROR %08lx\n", devicekey, rc); return FALSE; } DWORD valtype=0; DWORD maxsize= sizeof(DWORD); rc= RegQueryValueEx(hDevkey, valname, NULL, &valtype, (LPBYTE)pvalue, &maxsize); if (rc) { debug("RegQueryValueEx(%ls, target): ERROR %08lx\n", devicekey, rc); RegCloseKey(hDevkey); return FALSE; } RegCloseKey(hDevkey); return TRUE; } int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpCmdLine, int nCmdShow) { TCHAR *drvkey= lpCmdLine; KernelMode _km; DebugSetLogfile("tstdev.log"); TCHAR drvdll[MAX_PATH]; if (!ReadRegistryString(HKEY_LOCAL_MACHINE, drvkey, _T("Dll"), drvdll, MAX_PATH)) goto errorexit; TCHAR prefix[MAX_PATH]; if (!ReadRegistryString(HKEY_LOCAL_MACHINE, drvkey, _T("Prefix"), prefix, MAX_PATH)) goto errorexit; DWORD dwFlags=0; ReadRegistryDword(HKEY_LOCAL_MACHINE, drvkey, _T("Flags"), &dwFlags); debug("tstdev(%ls), drvdll=%ls prefix=%ls\n", drvkey, drvdll, prefix); HINSTANCE hLib= LoadLibrary(drvdll); if (hLib==NULL || hLib==INVALID_HANDLE_VALUE) { error("LoadLibrary(%ls)", drvdll); goto errorexit; } debug("driver dll loaded: %08lx\n", hLib); #define LOADPREFIXPROC(n) \ Drv##n = (PFN##n)GetProcAddress(hLib, ToWString(stringformat("%ls_" #n, prefix)).c_str()); \ if (Drv##n==NULL) { \ error("GetProcAddr(%ls)", ToWString(stringformat("%ls_" #n, prefix)).c_str()); \ goto errorexit_unloadlib; \ } #define LOADNOPREFIXPROC(n) \ Drv##n = (PFN##n)GetProcAddress(hLib, _T(#n)); \ if (Drv##n==NULL) { \ error("GetProcAddr(%ls)", _T(#n)); \ goto errorexit_unloadlib; \ } #ifndef DEVFLAGS_NAKEDENTRIES #define DEVFLAGS_NAKEDENTRIES 8 #endif if (dwFlags&DEVFLAGS_NAKEDENTRIES) { LOADNOPREFIXPROC(Init) LOADNOPREFIXPROC(Close) LOADNOPREFIXPROC(Deinit) LOADNOPREFIXPROC(Open) LOADNOPREFIXPROC(IOControl) LOADNOPREFIXPROC(Read) LOADNOPREFIXPROC(Write) LOADNOPREFIXPROC(Seek) // LOADNOPREFIXPROC(PowerUp) // LOADNOPREFIXPROC(PowerDown) } else { LOADPREFIXPROC(Init) LOADPREFIXPROC(Close) LOADPREFIXPROC(Deinit) LOADPREFIXPROC(Open) LOADPREFIXPROC(IOControl) LOADPREFIXPROC(Read) LOADPREFIXPROC(Write) LOADPREFIXPROC(Seek) // LOADPREFIXPROC(PowerUp) // LOADPREFIXPROC(PowerDown) } if (!(DrvInit && DrvClose && DrvDeinit && DrvOpen && DrvIOControl && DrvRead && DrvWrite && DrvSeek /*&& DrvPowerUp && DrvPowerDown */)) { error("not all driver functions loaded: DrvInit=%08lx DrvClose=%08lx DrvDeinit=%08lx DrvOpen=%08lx DrvIOControl=%08lx DrvRead=%08lx DrvWrite=%08lx DrvSeek=%08lx DrvPowerUp=%08lx DrvPowerDown\n", DrvInit, DrvClose, DrvDeinit, DrvOpen, DrvIOControl, DrvRead, DrvWrite, DrvSeek, DrvPowerUp, DrvPowerDown); goto errorexit_unloadlib; } debug("procs loaded\n"); DWORD dwDriver= DrvInit((DWORD)lpCmdLine); debug("init: driver=%08lx stat=%08lx\n", dwDriver, GetLastError()); DWORD dwHandle= DrvOpen(dwDriver, 0, 0); debugt("open: handle=%08lx stat=%08lx\n", dwHandle, GetLastError()); BYTE buf[16]; DWORD nRet = DrvRead(dwHandle, buf, 16); debug("read: %08lx, stat=%08lx\n", nRet, GetLastError()); // DWORD nWrit= DrvWrite(dwHandle, buf, 16); // debug("write: %08lx, stat=%08lx\n", nWrit, GetLastError()); BOOL clres= DrvClose(dwHandle); debugt("close: res=%08lx stat=%08lx\n", clres, GetLastError()); BOOL deres= DrvDeinit((DWORD)lpCmdLine); debug("deinit: res=%08lx stat=%08lx\n", deres, GetLastError()); return 0; errorexit_unloadlib: FreeLibrary(hLib); errorexit: return 1; }