Reactos
at master 184 lines 3.4 kB view raw
1/* 2 vfdlib.c 3 4 Virtual Floppy Drive for Windows 5 Driver control library 6 Miscellaneous functions 7 8 Copyright (C) 2003-2008 Ken Kato 9*/ 10 11#ifdef __cplusplus 12#pragma message(__FILE__": Compiled as C++ for testing purpose.") 13#endif // __cplusplus 14 15#define WIN32_LEAN_AND_MEAN 16#include <windows.h> 17#include <stdio.h> 18 19#ifdef _DEBUG 20#include <psapi.h> 21#endif // _DEBUG 22 23#include "vfdtypes.h" 24#include "vfdapi.h" 25#include "vfdlib.h" 26 27// 28// DLL Global variables 29// 30 31#ifndef __REACTOS__ 32extern HINSTANCE g_hDllModule = NULL; // Handle to this DLL itself 33extern UINT g_cDllRefCnt = 0; // Reference count of this DLL 34extern UINT g_nNotifyMsg = 0; // VFD notification message 35#else 36HINSTANCE g_hDllModule = NULL; // Handle to this DLL itself 37UINT g_cDllRefCnt = 0; // Reference count of this DLL 38UINT g_nNotifyMsg = 0; // VFD notification message 39#endif 40 41// 42// DllMain 43// 44BOOL WINAPI DllMain( 45 HINSTANCE hInstance, 46 DWORD dwReason, 47 LPVOID lpReserved) 48{ 49#ifdef _DEBUG 50 char name[MAX_PATH]; 51 HMODULE hMod; 52 DWORD size; 53 54 if (EnumProcessModules(GetCurrentProcess(), &hMod, sizeof(hMod), &size)) { 55 GetModuleBaseName(GetCurrentProcess(), hMod, name, sizeof(name)); 56 } 57 else { 58 strcpy(name, "unknown"); 59 } 60#endif // _DEBUG 61 62 UNREFERENCED_PARAMETER(lpReserved); 63 64 if (dwReason == DLL_PROCESS_ATTACH) { 65 VFDTRACE(0, ("DLL_PROCESS_ATTACH - %s\n", name)); 66 67 // this DLL doesn't need DLL_THREAD_ATTACH and DLL_THREAD_DETACH 68 DisableThreadLibraryCalls(hInstance); 69 70 // store the DLL instance handle 71 g_hDllModule = hInstance; 72 73 // register the VFD notification message 74 g_nNotifyMsg = RegisterWindowMessage(VFD_NOTIFY_MESSAGE); 75 76 } 77 else if (dwReason == DLL_PROCESS_DETACH) { 78 VFDTRACE(0, ("DLL_PROCESS_DETACH - %s\n", name)); 79 } 80 81 return TRUE; 82} 83 84// 85// Check running platform 86// 87BOOL WINAPI VfdIsValidPlatform() 88{ 89 BOOL (WINAPI *pfnIsWow64Process)(HANDLE, PBOOL); 90 BOOL wow64; 91 92 if (GetVersion() & 0x80000000) { 93 return FALSE; // doesn't work on Win9x 94 } 95 96 pfnIsWow64Process = (BOOL (WINAPI *)(HANDLE, PBOOL)) 97 GetProcAddress(GetModuleHandle("kernel32.dll"), "IsWow64Process"); 98 99 if (pfnIsWow64Process == NULL) { 100 return TRUE; // NT4 or 2000 -- assured to be 32 bit 101 } 102 103 wow64 = FALSE; 104 105 if (!pfnIsWow64Process(GetCurrentProcess(), &wow64)) { 106 return FALSE; 107 } 108 109 return !wow64; 110} 111 112// 113// Get VFD notification message value 114// 115UINT WINAPI VfdGetNotifyMessage() 116{ 117 return g_nNotifyMsg; 118} 119 120 121// 122// Get message text from this DLL module 123// 124PSTR ModuleMessage( 125 DWORD nFormat, ...) 126{ 127 PSTR p; 128 va_list args; 129 130 va_start(args, nFormat); 131 132 if (!FormatMessage( 133 FORMAT_MESSAGE_FROM_HMODULE | 134 FORMAT_MESSAGE_ALLOCATE_BUFFER, 135 g_hDllModule, nFormat, 0, (LPTSTR)&p, 0, &args)) { 136 p = NULL; 137 } 138 139 va_end(args); 140 141 return p; 142} 143 144// 145// Get system error message string 146// 147PCSTR SystemMessage( 148 DWORD nError) 149{ 150 static CHAR msg[256]; 151 152 if (!FormatMessage( 153 FORMAT_MESSAGE_FROM_SYSTEM | 154 FORMAT_MESSAGE_IGNORE_INSERTS, 155 NULL, nError, 0, msg, sizeof(msg), NULL)) { 156 157 _snprintf(msg, sizeof(msg), 158 "Unknown system error %lu (0x%08x)\n", nError, nError); 159 } 160 161 return msg; 162} 163 164#ifdef _DEBUG 165// 166// Format and output debug string 167// 168void DebugTrace( 169 PCSTR sFormat, ...) 170{ 171 CHAR buf[512]; 172 int len; 173 va_list args; 174 175 len = _snprintf(buf, sizeof(buf), 176 "%s(%lu) : ", TraceFile, TraceLine); 177 178 va_start(args, sFormat); 179 180 _vsnprintf(buf + len, sizeof(buf) - len, sFormat, args); 181 182 OutputDebugString(buf); 183} 184#endif // _DEBUG