From bef01d2a31c777f079890435934801c9b92bebda Mon Sep 17 00:00:00 2001 From: Frank Morgner Date: Mon, 24 Mar 2014 08:23:53 +0100 Subject: [PATCH] Migrated to new Version of Flavio's Windows driver --- .../win32/BixVReader/BixVReader.ini | 84 + .../vpcd.rc => BixVReader/BixVReader.rc} | 200 +- .../win32/{vpcd => BixVReader}/DllMain.cpp | 272 +- .../win32/BixVReader/PipeReader.cpp | 264 ++ .../win32/{vpcd => BixVReader}/Queue.cpp | 250 +- .../win32/{vpcd => BixVReader}/Queue.h | 73 +- virtualsmartcard/win32/BixVReader/Reader.cpp | 426 +++ virtualsmartcard/win32/BixVReader/Reader.h | 104 + .../win32/BixVReader/TcpIpReader.cpp | 306 ++ .../{vpcd => BixVReader}/VirtualSCReader.idl | 40 +- .../win32/BixVReader/VpcdReader.cpp | 147 + .../Win7/BixVReader.inx} | 160 +- .../win32/BixVReader/Win7/makefile | 7 + .../{vpcd => BixVReader/Win7}/makefile.inc | 16 +- .../win32/{vpcd => BixVReader/Win7}/sources | 150 +- .../win32/BixVReader/WinXP/BixVReader.inx | 80 + .../win32/BixVReader/WinXP/makefile | 7 + .../win32/BixVReader/WinXP/makefile.inc | 8 + .../win32/BixVReader/WinXP/sources | 79 + virtualsmartcard/win32/BixVReader/device.cpp | 331 ++ .../win32/{vpcd => BixVReader}/device.h | 210 +- .../win32/{vpcd => BixVReader}/driver.cpp | 144 +- .../win32/{vpcd => BixVReader}/driver.h | 74 +- .../win32/{vpcd => BixVReader}/exports.def | 30 +- .../win32/{vpcd => BixVReader}/internal.h | 149 +- .../win32/{vpcd => BixVReader}/memory.cpp | 186 +- virtualsmartcard/win32/BixVReader/memory.h | 10 + .../win32/{vpcd => BixVReader}/resource.h | 2992 ++++++++--------- .../win32/BixVReader/sectionLocker.cpp | 47 + .../win32/BixVReader/sectionLocker.h | 24 + virtualsmartcard/win32/vpcd/device.cpp | 432 --- .../win32/vpcd/makefile.inc.props | 37 - virtualsmartcard/win32/vpcd/memory.h | 9 - virtualsmartcard/win32/vpcd/sources.props | 33 - .../vpcd/vpcd-Package/vpcd-Package.vcxproj | 152 - virtualsmartcard/win32/vpcd/vpcd.sln | 83 - virtualsmartcard/win32/vpcd/vpcd.vcxproj | 217 -- 37 files changed, 4388 insertions(+), 3445 deletions(-) create mode 100644 virtualsmartcard/win32/BixVReader/BixVReader.ini rename virtualsmartcard/win32/{vpcd/vpcd.rc => BixVReader/BixVReader.rc} (88%) rename virtualsmartcard/win32/{vpcd => BixVReader}/DllMain.cpp (95%) create mode 100644 virtualsmartcard/win32/BixVReader/PipeReader.cpp rename virtualsmartcard/win32/{vpcd => BixVReader}/Queue.cpp (90%) rename virtualsmartcard/win32/{vpcd => BixVReader}/Queue.h (95%) create mode 100644 virtualsmartcard/win32/BixVReader/Reader.cpp create mode 100644 virtualsmartcard/win32/BixVReader/Reader.h create mode 100644 virtualsmartcard/win32/BixVReader/TcpIpReader.cpp rename virtualsmartcard/win32/{vpcd => BixVReader}/VirtualSCReader.idl (95%) create mode 100644 virtualsmartcard/win32/BixVReader/VpcdReader.cpp rename virtualsmartcard/win32/{vpcd/vpcd.inx => BixVReader/Win7/BixVReader.inx} (74%) create mode 100644 virtualsmartcard/win32/BixVReader/Win7/makefile rename virtualsmartcard/win32/{vpcd => BixVReader/Win7}/makefile.inc (96%) rename virtualsmartcard/win32/{vpcd => BixVReader/Win7}/sources (69%) create mode 100644 virtualsmartcard/win32/BixVReader/WinXP/BixVReader.inx create mode 100644 virtualsmartcard/win32/BixVReader/WinXP/makefile create mode 100644 virtualsmartcard/win32/BixVReader/WinXP/makefile.inc create mode 100644 virtualsmartcard/win32/BixVReader/WinXP/sources create mode 100644 virtualsmartcard/win32/BixVReader/device.cpp rename virtualsmartcard/win32/{vpcd => BixVReader}/device.h (67%) rename virtualsmartcard/win32/{vpcd => BixVReader}/driver.cpp (86%) rename virtualsmartcard/win32/{vpcd => BixVReader}/driver.h (96%) rename virtualsmartcard/win32/{vpcd => BixVReader}/exports.def (95%) rename virtualsmartcard/win32/{vpcd => BixVReader}/internal.h (79%) rename virtualsmartcard/win32/{vpcd => BixVReader}/memory.cpp (61%) create mode 100644 virtualsmartcard/win32/BixVReader/memory.h rename virtualsmartcard/win32/{vpcd => BixVReader}/resource.h (97%) create mode 100644 virtualsmartcard/win32/BixVReader/sectionLocker.cpp create mode 100644 virtualsmartcard/win32/BixVReader/sectionLocker.h delete mode 100644 virtualsmartcard/win32/vpcd/device.cpp delete mode 100644 virtualsmartcard/win32/vpcd/makefile.inc.props delete mode 100644 virtualsmartcard/win32/vpcd/memory.h delete mode 100644 virtualsmartcard/win32/vpcd/sources.props delete mode 100644 virtualsmartcard/win32/vpcd/vpcd-Package/vpcd-Package.vcxproj delete mode 100644 virtualsmartcard/win32/vpcd/vpcd.sln delete mode 100644 virtualsmartcard/win32/vpcd/vpcd.vcxproj diff --git a/virtualsmartcard/win32/BixVReader/BixVReader.ini b/virtualsmartcard/win32/BixVReader/BixVReader.ini new file mode 100644 index 0000000..b148a78 --- /dev/null +++ b/virtualsmartcard/win32/BixVReader/BixVReader.ini @@ -0,0 +1,84 @@ +[Driver] +NumReaders=12 + +[Reader0] +RPC_TYPE=0 +VENDOR_NAME=VirtualCard +VENDOR_IFD_TYPE=BixReader +DECIVE_UNIT=0 + +[Reader1] +RPC_TYPE=1 +VENDOR_NAME=VirtualCard +VENDOR_IFD_TYPE=BixReader +DECIVE_UNIT=1 + +[Reader2] +RPC_TYPE=2 +VENDOR_NAME=Virtual Smart Card Architecture +VENDOR_IFD_TYPE=Virtual PCD +TCP_PORT=35963 +DECIVE_UNIT=2 + +[Reader3] +RPC_TYPE=2 +VENDOR_NAME=Virtual Smart Card Architecture +VENDOR_IFD_TYPE=Virtual PCD +TCP_PORT=35964 +DECIVE_UNIT=3 + +[Reader4] +RPC_TYPE=2 +VENDOR_NAME=Virtual Smart Card Architecture +VENDOR_IFD_TYPE=Virtual PCD +TCP_PORT=35965 +DECIVE_UNIT=4 + +[Reader5] +RPC_TYPE=2 +VENDOR_NAME=Virtual Smart Card Architecture +VENDOR_IFD_TYPE=Virtual PCD +TCP_PORT=35966 +DECIVE_UNIT=5 + +[Reader6] +RPC_TYPE=2 +VENDOR_NAME=Virtual Smart Card Architecture +VENDOR_IFD_TYPE=Virtual PCD +TCP_PORT=35967 +DECIVE_UNIT=6 + +[Reader7] +RPC_TYPE=2 +VENDOR_NAME=Virtual Smart Card Architecture +VENDOR_IFD_TYPE=Virtual PCD +TCP_PORT=35968 +DECIVE_UNIT=7 + +[Reader8] +RPC_TYPE=2 +VENDOR_NAME=Virtual Smart Card Architecture +VENDOR_IFD_TYPE=Virtual PCD +TCP_PORT=35969 +DECIVE_UNIT=8 + +[Reader9] +RPC_TYPE=2 +VENDOR_NAME=Virtual Smart Card Architecture +VENDOR_IFD_TYPE=Virtual PCD +TCP_PORT=35970 +DECIVE_UNIT=9 + +[Reader10] +RPC_TYPE=2 +VENDOR_NAME=Virtual Smart Card Architecture +VENDOR_IFD_TYPE=Virtual PCD +TCP_PORT=35971 +DECIVE_UNIT=10 + +[Reader11] +RPC_TYPE=2 +VENDOR_NAME=Virtual Smart Card Architecture +VENDOR_IFD_TYPE=Virtual PCD +TCP_PORT=35972 +DECIVE_UNIT=11 diff --git a/virtualsmartcard/win32/vpcd/vpcd.rc b/virtualsmartcard/win32/BixVReader/BixVReader.rc similarity index 88% rename from virtualsmartcard/win32/vpcd/vpcd.rc rename to virtualsmartcard/win32/BixVReader/BixVReader.rc index 204e8e0..fb1c6cc 100644 --- a/virtualsmartcard/win32/vpcd/vpcd.rc +++ b/virtualsmartcard/win32/BixVReader/BixVReader.rc @@ -1,100 +1,100 @@ -// Microsoft Visual C++ generated resource script. -// -#include "resource.h" - -#define APSTUDIO_READONLY_SYMBOLS -///////////////////////////////////////////////////////////////////////////// -// -// Generated from the TEXTINCLUDE 2 resource. -// - -///////////////////////////////////////////////////////////////////////////// -#undef APSTUDIO_READONLY_SYMBOLS - -///////////////////////////////////////////////////////////////////////////// -// Italian (Italy) resources - -#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ITA) -#ifdef _WIN32 -LANGUAGE LANG_ITALIAN, SUBLANG_ITALIAN -#pragma code_page(1252) -#endif //_WIN32 - -///////////////////////////////////////////////////////////////////////////// -// -// Version -// - -VS_VERSION_INFO VERSIONINFO - FILEVERSION 6,0,6000,16384 - PRODUCTVERSION 6,0,6000,16384 - FILEFLAGSMASK 0x3fL -#ifdef _DEBUG - FILEFLAGS 0x9L -#else - FILEFLAGS 0x8L -#endif - FILEOS 0x40004L - FILETYPE 0x2L - FILESUBTYPE 0x0L -BEGIN - BLOCK "StringFileInfo" - BEGIN - BLOCK "001004b0" - BEGIN - VALUE "CompanyName", "Windows (R) Codename Longhorn DDK provider" - VALUE "FileDescription", "Virtual Smart Card Driver" - VALUE "FileVersion", "6.0.6000.16384" - VALUE "InternalName", "vpcd" - VALUE "LegalCopyright", "© Microsoft Corporation. All rights reserved." - VALUE "OriginalFilename", "vpcd.dll" - VALUE "ProductName", "Windows (R) Codename Longhorn DDK driver" - VALUE "ProductVersion", "6.0.6000.16384" - END - END - BLOCK "VarFileInfo" - BEGIN - VALUE "Translation", 0x10, 1200 - END -END - - -#ifdef APSTUDIO_INVOKED -///////////////////////////////////////////////////////////////////////////// -// -// TEXTINCLUDE -// - -1 TEXTINCLUDE -BEGIN - "resource.h\0" -END - -2 TEXTINCLUDE -BEGIN - "\0" -END - -3 TEXTINCLUDE -BEGIN - "\r\n" - "\0" -END - -#endif // APSTUDIO_INVOKED - -#endif // Italian (Italy) resources -///////////////////////////////////////////////////////////////////////////// - - - -#ifndef APSTUDIO_INVOKED -///////////////////////////////////////////////////////////////////////////// -// -// Generated from the TEXTINCLUDE 3 resource. -// - -P -///////////////////////////////////////////////////////////////////////////// -#endif // not APSTUDIO_INVOKED - +// Microsoft Visual C++ generated resource script. +// +#include "resource.h" + +#define APSTUDIO_READONLY_SYMBOLS +///////////////////////////////////////////////////////////////////////////// +// +// Generated from the TEXTINCLUDE 2 resource. +// + +///////////////////////////////////////////////////////////////////////////// +#undef APSTUDIO_READONLY_SYMBOLS + +///////////////////////////////////////////////////////////////////////////// +// Italian (Italy) resources + +#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ITA) +#ifdef _WIN32 +LANGUAGE LANG_ITALIAN, SUBLANG_ITALIAN +#pragma code_page(1252) +#endif //_WIN32 + +///////////////////////////////////////////////////////////////////////////// +// +// Version +// + +VS_VERSION_INFO VERSIONINFO + FILEVERSION 6,0,6000,16384 + PRODUCTVERSION 6,0,6000,16384 + FILEFLAGSMASK 0x3fL +#ifdef _DEBUG + FILEFLAGS 0x9L +#else + FILEFLAGS 0x8L +#endif + FILEOS 0x40004L + FILETYPE 0x2L + FILESUBTYPE 0x0L +BEGIN + BLOCK "StringFileInfo" + BEGIN + BLOCK "001004b0" + BEGIN + VALUE "CompanyName", "Windows (R) Codename Longhorn DDK provider" + VALUE "FileDescription", "Bix Virtual Smart Card Driver" + VALUE "FileVersion", "6.0.6000.16384" + VALUE "InternalName", "BixVReader" + VALUE "LegalCopyright", "© Microsoft Corporation. All rights reserved." + VALUE "OriginalFilename", "BixVReader.dll" + VALUE "ProductName", "Windows (R) Codename Longhorn DDK driver" + VALUE "ProductVersion", "6.0.6000.16384" + END + END + BLOCK "VarFileInfo" + BEGIN + VALUE "Translation", 0x10, 1200 + END +END + + +#ifdef APSTUDIO_INVOKED +///////////////////////////////////////////////////////////////////////////// +// +// TEXTINCLUDE +// + +1 TEXTINCLUDE +BEGIN + "resource.h\0" +END + +2 TEXTINCLUDE +BEGIN + "\0" +END + +3 TEXTINCLUDE +BEGIN + "\r\n" + "\0" +END + +#endif // APSTUDIO_INVOKED + +#endif // Italian (Italy) resources +///////////////////////////////////////////////////////////////////////////// + + + +#ifndef APSTUDIO_INVOKED +///////////////////////////////////////////////////////////////////////////// +// +// Generated from the TEXTINCLUDE 3 resource. +// + +P +///////////////////////////////////////////////////////////////////////////// +#endif // not APSTUDIO_INVOKED + diff --git a/virtualsmartcard/win32/vpcd/DllMain.cpp b/virtualsmartcard/win32/BixVReader/DllMain.cpp similarity index 95% rename from virtualsmartcard/win32/vpcd/DllMain.cpp rename to virtualsmartcard/win32/BixVReader/DllMain.cpp index 6b6cc1e..6065865 100644 --- a/virtualsmartcard/win32/vpcd/DllMain.cpp +++ b/virtualsmartcard/win32/BixVReader/DllMain.cpp @@ -1,134 +1,138 @@ - -#include "internal.h" - -class CVirtualSmartCardDriverModule : public CAtlDllModuleT {} _AtlModule; - -///////////////////////////////////////////////////////////////////////// -// -// DllMain -// -// This is the main DLL Entry Point. -// -// Parameters: -// hInstance - Handle to the DLL module -// dwReason - Indicates why the DLL entry point is being called -// lpReserved - Additional information based on dwReason -// -// Return Values: -// TRUE = initialization succeeds -// FALSE = initialization fails -// -///////////////////////////////////////////////////////////////////////// - -extern "C" BOOL WINAPI DllMain(HINSTANCE hInstance, - DWORD dwReason, - LPVOID lpReserved) -{ - (lpReserved); - - switch (dwReason) - { - case DLL_PROCESS_ATTACH: - DisableThreadLibraryCalls(hInstance); - - break; - - case DLL_PROCESS_DETACH: - _AtlModule.Term(); - break; - - default: - break; - } - - // Call the ATL module class so it can initialize - return _AtlModule.DllMain(dwReason, lpReserved); -} - -///////////////////////////////////////////////////////////////////////// -// -// DllCanUnloadNow -// -// Used to determine whether the DLL can be unloaded by OLE -// -// Parameters: -// void - (unused argument) -// -// Return Values: -// S_OK: DLL can be unloaded -// S_FALSE: DLL cannot be unloaded now -// -///////////////////////////////////////////////////////////////////////// -STDAPI DllCanUnloadNow(void) -{ - return _AtlModule.DllCanUnloadNow(); -} - -///////////////////////////////////////////////////////////////////////// -// -// DllGetClassObject -// -// Returns a class factory to create an object of the requested type -// -// Parameters: -// rclsid - CLSID that will associate the correct data and code -// riid - Reference to the IID the caller will use -// ppv - pointer to an interface pointer requested in riid -// -// Return Values: -// S_OK: The object was retrieved successfully. -// CLASS_E_CLASSNOTAVAILABLE: The DLL does not support the class -// -///////////////////////////////////////////////////////////////////////// - -STDAPI DllGetClassObject(__in REFCLSID rclsid, __in REFIID riid, __deref_out LPVOID* ppv) -{ - return _AtlModule.DllGetClassObject(rclsid, riid, ppv); -} - -///////////////////////////////////////////////////////////////////////// -// -// DllRegisterServer -// -// Adds entries to the system registry -// -// Parameters: -// void - (unused argument) -// -// Return Values: -// S_OK: The registry entries were created successfully -// SELFREG_E_TYPELIB: The server was unable to complete the -// registration of all the type libraries used by its classes -// SELFREG_E_CLASS: The server was unable to complete the -// registration of all the object classes -// -///////////////////////////////////////////////////////////////////////// -STDAPI DllRegisterServer(void) -{ - return S_OK; -} - -///////////////////////////////////////////////////////////////////////// -// -// DllUnregisterServer -// -// Removes entries from the system registry -// -// Parameters: -// void - (unused argument) -// -// Return Values: -// S_OK: The registry entries were removed successfully -// S_FALSE: Unregistration of known entries was successful, but -// other entries still exist for this server's classes -// SELFREG_E_TYPELIB: The server was unable to remove the entries -// of all the type libraries used by its classes -// SELFREG_E_CLASS: The server was unable to to remove the entries -// of all the object classes -// -///////////////////////////////////////////////////////////////////////// -STDAPI DllUnregisterServer(void) -{ - return S_OK; -} - +#include "internal.h" + +class CVirtualSmartCardDriverModule : public CAtlDllModuleT {} _AtlModule; + +///////////////////////////////////////////////////////////////////////// +// +// DllMain +// +// This is the main DLL Entry Point. +// +// Parameters: +// hInstance - Handle to the DLL module +// dwReason - Indicates why the DLL entry point is being called +// lpReserved - Additional information based on dwReason +// +// Return Values: +// TRUE = initialization succeeds +// FALSE = initialization fails +// +///////////////////////////////////////////////////////////////////////// + +extern "C" BOOL WINAPI DllMain(HINSTANCE hInstance, + DWORD dwReason, + LPVOID lpReserved) +{ + inFunc + (lpReserved); + + switch (dwReason) + { + case DLL_PROCESS_ATTACH: + DisableThreadLibraryCalls(hInstance); + + break; + + case DLL_PROCESS_DETACH: + _AtlModule.Term(); + break; + + default: + break; + } + + // Call the ATL module class so it can initialize + return _AtlModule.DllMain(dwReason, lpReserved); +} + +///////////////////////////////////////////////////////////////////////// +// +// DllCanUnloadNow +// +// Used to determine whether the DLL can be unloaded by OLE +// +// Parameters: +// void - (unused argument) +// +// Return Values: +// S_OK: DLL can be unloaded +// S_FALSE: DLL cannot be unloaded now +// +///////////////////////////////////////////////////////////////////////// +STDAPI DllCanUnloadNow(void) +{ + inFunc + return _AtlModule.DllCanUnloadNow(); +} + +///////////////////////////////////////////////////////////////////////// +// +// DllGetClassObject +// +// Returns a class factory to create an object of the requested type +// +// Parameters: +// rclsid - CLSID that will associate the correct data and code +// riid - Reference to the IID the caller will use +// ppv - pointer to an interface pointer requested in riid +// +// Return Values: +// S_OK: The object was retrieved successfully. +// CLASS_E_CLASSNOTAVAILABLE: The DLL does not support the class +// +///////////////////////////////////////////////////////////////////////// + +STDAPI DllGetClassObject(__in REFCLSID rclsid, __in REFIID riid, __deref_out LPVOID* ppv) +{ + inFunc + return _AtlModule.DllGetClassObject(rclsid, riid, ppv); +} + +///////////////////////////////////////////////////////////////////////// +// +// DllRegisterServer +// +// Adds entries to the system registry +// +// Parameters: +// void - (unused argument) +// +// Return Values: +// S_OK: The registry entries were created successfully +// SELFREG_E_TYPELIB: The server was unable to complete the +// registration of all the type libraries used by its classes +// SELFREG_E_CLASS: The server was unable to complete the +// registration of all the object classes +// +///////////////////////////////////////////////////////////////////////// +STDAPI DllRegisterServer(void) +{ + inFunc + return S_OK; +} + +///////////////////////////////////////////////////////////////////////// +// +// DllUnregisterServer +// +// Removes entries from the system registry +// +// Parameters: +// void - (unused argument) +// +// Return Values: +// S_OK: The registry entries were removed successfully +// S_FALSE: Unregistration of known entries was successful, but +// other entries still exist for this server's classes +// SELFREG_E_TYPELIB: The server was unable to remove the entries +// of all the type libraries used by its classes +// SELFREG_E_CLASS: The server was unable to to remove the entries +// of all the object classes +// +///////////////////////////////////////////////////////////////////////// +STDAPI DllUnregisterServer(void) +{ + inFunc + return S_OK; +} + diff --git a/virtualsmartcard/win32/BixVReader/PipeReader.cpp b/virtualsmartcard/win32/BixVReader/PipeReader.cpp new file mode 100644 index 0000000..3027e9d --- /dev/null +++ b/virtualsmartcard/win32/BixVReader/PipeReader.cpp @@ -0,0 +1,264 @@ +#include "internal.h" +#include "VirtualSCReader.h" +#include "reader.h" +#include "device.h" +#include +#include "memory.h" +#include +#include "sectionLocker.h" + +BOOL CreateMyDACL(SECURITY_ATTRIBUTES * pSA) +{ + TCHAR * szSD = TEXT("D:") // Discretionary ACL + TEXT("(D;OICI;GA;;;BG)") // Deny access to + // built-in guests + TEXT("(D;OICI;GA;;;AN)") // Deny access to + // anonymous logon + TEXT("(A;OICI;GRGWGX;;;AU)") // Allow + // read/write/execute + // to authenticated + // users + TEXT("(A;OICI;GA;;;BA)"); // Allow full control + // to administrators + + if (NULL == pSA) + return FALSE; + + return ConvertStringSecurityDescriptorToSecurityDescriptor( + szSD, + SDDL_REVISION_1, + &(pSA->lpSecurityDescriptor), + NULL); +} + +PipeReader::PipeReader() { + rpcType=0; + state=SCARD_ABSENT; + + InitializeCriticalSection(&eventSection); + InitializeCriticalSection(&dataSection); +} + +void PipeReader::init(wchar_t *section) { + wchar_t temp[300]; + swprintf(temp,L"SCardSimulatorDriver%i",instance); + GetPrivateProfileStringW(section,L"PIPE_NAME",temp,pipeName,300,L"BixVReader.ini"); + swprintf(temp,L"SCardSimulatorDriverEvents%i",instance); + GetPrivateProfileStringW(section,L"PIPE_EVENT_NAME",temp,pipeEventName,300,L"BixVReader.ini"); + +} + +bool PipeReader::CheckATR() { + //SectionLocker lock(dataSection); + + if (pipe==NULL) + return false; + DWORD read=0; + DWORD command=1; + if (!WriteFile(pipe,&command,sizeof(DWORD),&read,NULL)) { + return false; + } + FlushFileBuffers(pipe); + DWORD size=0; + if (!ReadFile(pipe,&size,sizeof(DWORD),&read,NULL)) { + return false; + } + if (size==0) + return false; + BYTE ATR[100]; + if (!ReadFile(pipe,ATR,size,&read,NULL)) { + return false; + } + return true; +} +bool PipeReader::QueryTransmit(BYTE *APDU,int APDUlen,BYTE *Resp,int *Resplen) { + //SectionLocker lock(dataSection); + + if (pipe==NULL) + return false; + DWORD command=2; + DWORD read=0; + if (!WriteFile(pipe,&command,sizeof(DWORD),&read,NULL)) { + pipe=NULL; + return false; + } + DWORD dwAPDUlen=(DWORD)APDUlen; + if (!WriteFile(pipe,&dwAPDUlen,sizeof(DWORD),&read,NULL)) { + pipe=NULL; + return false; + } + if (!WriteFile(pipe,APDU,APDUlen,&read,NULL)) { + pipe=NULL; + return false; + } + FlushFileBuffers(pipe); + DWORD dwRespLen=0; + if (!ReadFile(pipe,&dwRespLen,sizeof(DWORD),&read,NULL)) { + pipe=NULL; + return false; + } + if (!ReadFile(pipe,Resp,dwRespLen,&read,NULL)) { + pipe=NULL; + return false; + } + (*Resplen)=(int)dwRespLen; + return true; +} + +bool PipeReader::QueryATR(BYTE *ATR,DWORD *ATRsize,bool reset) { + //SectionLocker lock(dataSection); + + if (pipe==NULL) + return false; + DWORD command=reset ? 0 : 1; + DWORD read=0; + if (!WriteFile(pipe,&command,sizeof(DWORD),&read,NULL)) { + pipe=NULL; + return false; + } + FlushFileBuffers(pipe); + DWORD size=0; + if (!ReadFile(pipe,&size,sizeof(DWORD),&read,NULL)) { + pipe=NULL; + return false; + } + if (size==0) + return false; + if (!ReadFile(pipe,ATR,size,&read,NULL)) { + pipe=NULL; + return false; + } + (*ATRsize)=size; + return true; +} + +DWORD PipeReader::startServer() { + SECURITY_ATTRIBUTES sa; + sa.nLength = sizeof(SECURITY_ATTRIBUTES); + sa.bInheritHandle = FALSE; + CreateMyDACL(&sa); + + wchar_t temp[300]; + swprintf(temp,L"\\\\.\\pipe\\%s",pipeName); + HANDLE _pipe=CreateNamedPipe(temp,PIPE_ACCESS_DUPLEX|FILE_FLAG_OVERLAPPED,PIPE_TYPE_BYTE,PIPE_UNLIMITED_INSTANCES,0,0,0,&sa); + swprintf(temp,L"\\\\.\\pipe\\%s",pipeEventName); + HANDLE _eventpipe=CreateNamedPipe(temp,PIPE_ACCESS_DUPLEX|FILE_FLAG_OVERLAPPED,PIPE_TYPE_BYTE,PIPE_UNLIMITED_INSTANCES,0,0,0,&sa); + wchar_t log[300]; + swprintf(log,L"[BixVReader]Pipe created:%s:%08x",pipeName,_pipe); + OutputDebugString(log); + + while (true) { + //__try { + BOOL ris=ConnectNamedPipe(_pipe,NULL); + if (ris==0) { + swprintf(log,L"[BixVReader]Pipe NOT connected:%x",GetLastError()); + OutputDebugString(log); + } + else { + swprintf(log,L"[BixVReader]Pipe connected"); + OutputDebugString(log); + } + ris=ConnectNamedPipe(_eventpipe,NULL); + if (ris==0) { + swprintf(log,L"[BixVReader]Event Pipe NOT connected:%x",GetLastError()); + OutputDebugString(log); + } + else { + swprintf(log,L"[BixVReader]Event Pipe connected"); + OutputDebugString(log); + } + pipe=_pipe; + eventpipe=_eventpipe; + if (waitInsertIpr!=NULL) { + SectionLocker lock(device->m_RequestLock); + // if I'm waiting for card insertion, verify if there's a card present + if (initProtocols()) { + if (waitInsertIpr->UnmarkCancelable()==S_OK) + waitInsertIpr->CompleteWithInformation(STATUS_SUCCESS, 0); + waitInsertIpr=NULL; + state=SCARD_SWALLOWED; + } + } + + while (true) { + // wait for a command + DWORD command=0; + DWORD read=0; + if (!ReadFile(eventpipe,&command,sizeof(DWORD),&read,NULL)) { + state=SCARD_ABSENT; + OutputDebugString(L"[BixVReader]Pipe error"); + powered=0; + pipe=NULL; + eventpipe=NULL; + if (waitRemoveIpr!=NULL) {// card inserted + SectionLocker lock(device->m_RequestLock); + OutputDebugString(L"[BixVReader]complete Wait Remove"); + if (waitRemoveIpr->UnmarkCancelable()==S_OK) { + OutputDebugString(L"[BixVReader]Wait Remove Unmarked"); + waitRemoveIpr->CompleteWithInformation(STATUS_SUCCESS, 0); + OutputDebugString(L"[BixVReader]Wait Remove Completed"); + } + waitRemoveIpr=NULL; + } + if (waitInsertIpr!=NULL) {// card removed + SectionLocker lock(device->m_RequestLock); + OutputDebugString(L"[BixVReader]cancel Wait Remove"); + if (waitInsertIpr->UnmarkCancelable()==S_OK) { + OutputDebugString(L"[BixVReader]Wait Insert Unmarked"); + waitInsertIpr->CompleteWithInformation(HRESULT_FROM_WIN32(ERROR_CANCELLED), 0); + OutputDebugString(L"[BixVReader]Wait Insert Cancelled"); + } + waitInsertIpr=NULL; + } + DisconnectNamedPipe(_pipe); + DisconnectNamedPipe(_eventpipe); + break; + } + OutputDebugString(L"[BixVReader]Pipe data"); + if (command==0) + powered=0; + if (command==0 && waitRemoveIpr!=NULL) {// card removed + SectionLocker lock(device->m_RequestLock); + state=SCARD_ABSENT; + if (waitRemoveIpr->UnmarkCancelable()==S_OK) { + waitRemoveIpr->CompleteWithInformation(STATUS_SUCCESS, 0); + } + waitRemoveIpr=NULL; + } + else if (command==1 && waitInsertIpr!=NULL) {// card inserted + SectionLocker lock(device->m_RequestLock); + state=SCARD_SWALLOWED; + initProtocols(); + if (waitInsertIpr->UnmarkCancelable()==S_OK) { + waitInsertIpr->CompleteWithInformation(STATUS_SUCCESS, 0); + } + waitInsertIpr=NULL; + } + } + //} + //__except(EXCEPTION_EXECUTE_HANDLER) { + // wchar_t log[300]; + // DWORD err=GetExceptionCode(); + // swprintf(log,L"Exception:%08X",err); + // OutputDebugString(log); + //} + } + OutputDebugString(L"[BixVReader]Pipe quit!!!"); + return 0; +} + +void PipeReader::shutdown() { + state=SCARD_ABSENT; + if (waitRemoveIpr!=NULL) { + SectionLocker lock(device->m_RequestLock); + if (waitRemoveIpr->UnmarkCancelable()==S_OK) + waitRemoveIpr->Complete(HRESULT_FROM_WIN32(ERROR_CANCELLED)); + waitRemoveIpr=NULL; + } + if (waitInsertIpr!=NULL) { + SectionLocker lock(device->m_RequestLock); + if (waitInsertIpr->UnmarkCancelable()==S_OK) + waitInsertIpr->Complete(HRESULT_FROM_WIN32(ERROR_CANCELLED)); + waitInsertIpr=NULL; + } +} diff --git a/virtualsmartcard/win32/vpcd/Queue.cpp b/virtualsmartcard/win32/BixVReader/Queue.cpp similarity index 90% rename from virtualsmartcard/win32/vpcd/Queue.cpp rename to virtualsmartcard/win32/BixVReader/Queue.cpp index 1fcd073..a423e90 100644 --- a/virtualsmartcard/win32/vpcd/Queue.cpp +++ b/virtualsmartcard/win32/BixVReader/Queue.cpp @@ -1,126 +1,124 @@ - - -#include "internal.h" -#include "Device.h" -#include "Queue.h" - -///////////////////////////////////////////////////////////////////////// -// -// CMyQueue::CMyQueue -// -// Object constructor function -// -// Initialize member variables -// -///////////////////////////////////////////////////////////////////////// -CMyQueue::CMyQueue() : - m_pParentDevice(NULL) -{ - state=0; -} - -///////////////////////////////////////////////////////////////////////// -// -// CMyQueue::~CMyQueue -// -// Object destructor function -// -// -///////////////////////////////////////////////////////////////////////// -CMyQueue::~CMyQueue() -{ - // Release the reference that was incremented in CreateInstance() - SAFE_RELEASE(m_pParentDevice); -} - -///////////////////////////////////////////////////////////////////////// -// -// CMyQueue::CreateInstance -// -// This function supports the COM factory creation system -// -// Parameters: -// parentDevice - A pointer to the CWSSDevice object -// ppUkwn - pointer to a pointer to the queue to be returned -// -// Return Values: -// S_OK: The queue was created successfully -// -///////////////////////////////////////////////////////////////////////// -HRESULT CMyQueue::CreateInstance(__in IWDFDevice* pWdfDevice, CMyDevice* pMyDevice) -{ - inFunc; - CComObject* pMyQueue = NULL; - - if(NULL == pMyDevice) - { - return E_INVALIDARG; - } - - HRESULT hr = CComObject::CreateInstance(&pMyQueue); - - if(SUCCEEDED(hr)) - { - // AddRef the object - pMyQueue->AddRef(); - - // Store the parent device object - pMyQueue->m_pParentDevice = pMyDevice; - - // Increment the reference for the lifetime of the CMyQueue object. - pMyQueue->m_pParentDevice->AddRef(); - - CComPtr spIUnknown; - hr = pMyQueue->QueryInterface(IID_IUnknown, (void**)&spIUnknown); - - if(SUCCEEDED(hr)) - { - // Create the framework queue - CComPtr spDefaultQueue; - hr = pWdfDevice->CreateIoQueue( spIUnknown, - TRUE, // DefaultQueue - WdfIoQueueDispatchParallel, // Parallel queue handling - FALSE, // PowerManaged - TRUE, // AllowZeroLengthRequests - &spDefaultQueue - ); - if (FAILED(hr)) - { - OutputDebugString (L"IoQueue NOT Created\n"); - } - else - OutputDebugString (L"IoQueue Created\n"); - - } - - // Release the pMyQueue pointer when done. Note: UMDF holds a reference to it above - SAFE_RELEASE(pMyQueue); - } - - return hr; -} -///////////////////////////////////////////////////////////////////////// -// -// CMyQueue::OnDeviceIoControl -// -// This method is called when an IOCTL is sent to the device -// -// Parameters: -// pQueue - pointer to an IO queue -// pRequest - pointer to an IO request -// ControlCode - The IOCTL to process -// InputBufferSizeInBytes - the size of the input buffer -// OutputBufferSizeInBytes - the size of the output buffer -// -///////////////////////////////////////////////////////////////////////// -STDMETHODIMP_ (void) CMyQueue::OnDeviceIoControl( - __in IWDFIoQueue* pQueue, - __in IWDFIoRequest* pRequest, - __in ULONG ControlCode, - SIZE_T InputBufferSizeInBytes, - SIZE_T OutputBufferSizeInBytes - ) -{ - m_pParentDevice->ProcessIoControl(pQueue,pRequest,ControlCode,InputBufferSizeInBytes,OutputBufferSizeInBytes); - -} +#include "internal.h" +#include "Device.h" +#include "Queue.h" +#include "SectionLocker.h" + +///////////////////////////////////////////////////////////////////////// +// +// CMyQueue::CMyQueue +// +// Object constructor function +// +// Initialize member variables +// +///////////////////////////////////////////////////////////////////////// +CMyQueue::CMyQueue() : + m_pParentDevice(NULL) +{ +} + +///////////////////////////////////////////////////////////////////////// +// +// CMyQueue::~CMyQueue +// +// Object destructor function +// +// +///////////////////////////////////////////////////////////////////////// +CMyQueue::~CMyQueue() +{ + // Release the reference that was incremented in CreateInstance() + SAFE_RELEASE(m_pParentDevice); +} + +///////////////////////////////////////////////////////////////////////// +// +// CMyQueue::CreateInstance +// +// This function supports the COM factory creation system +// +// Parameters: +// parentDevice - A pointer to the CWSSDevice object +// ppUkwn - pointer to a pointer to the queue to be returned +// +// Return Values: +// S_OK: The queue was created successfully +// +///////////////////////////////////////////////////////////////////////// +HRESULT CMyQueue::CreateInstance(__in IWDFDevice* pWdfDevice, CMyDevice* pMyDevice) +{ + inFunc + SectionLogger a(__FUNCTION__); + CComObject* pMyQueue = NULL; + + if(NULL == pMyDevice) + { + return E_INVALIDARG; + } + + HRESULT hr = CComObject::CreateInstance(&pMyQueue); + + if(SUCCEEDED(hr)) + { + // AddRef the object + pMyQueue->AddRef(); + + // Store the parent device object + pMyQueue->m_pParentDevice = pMyDevice; + + // Increment the reference for the lifetime of the CMyQueue object. + pMyQueue->m_pParentDevice->AddRef(); + + CComPtr spIUnknown; + hr = pMyQueue->QueryInterface(IID_IUnknown, (void**)&spIUnknown); + + if(SUCCEEDED(hr)) + { + // Create the framework queue + CComPtr spDefaultQueue; + hr = pWdfDevice->CreateIoQueue( spIUnknown, + TRUE, // DefaultQueue + WdfIoQueueDispatchParallel, // Parallel queue handling + FALSE, // PowerManaged + TRUE, // AllowZeroLengthRequests + &spDefaultQueue + ); + if (FAILED(hr)) + { + OutputDebugString (L"[BixVReader]IoQueue NOT Created\n"); + } + else + OutputDebugString (L"[BixVReader]IoQueue Created\n"); + + } + + // Release the pMyQueue pointer when done. Note: UMDF holds a reference to it above + SAFE_RELEASE(pMyQueue); + } + + return hr; +} +///////////////////////////////////////////////////////////////////////// +// +// CMyQueue::OnDeviceIoControl +// +// This method is called when an IOCTL is sent to the device +// +// Parameters: +// pQueue - pointer to an IO queue +// pRequest - pointer to an IO request +// ControlCode - The IOCTL to process +// InputBufferSizeInBytes - the size of the input buffer +// OutputBufferSizeInBytes - the size of the output buffer +// +///////////////////////////////////////////////////////////////////////// +STDMETHODIMP_ (void) CMyQueue::OnDeviceIoControl( + __in IWDFIoQueue* pQueue, + __in IWDFIoRequest* pRequest, + __in ULONG ControlCode, + SIZE_T InputBufferSizeInBytes, + SIZE_T OutputBufferSizeInBytes + ) +{ + m_pParentDevice->ProcessIoControl(pQueue,pRequest,ControlCode,InputBufferSizeInBytes,OutputBufferSizeInBytes); +} diff --git a/virtualsmartcard/win32/vpcd/Queue.h b/virtualsmartcard/win32/BixVReader/Queue.h similarity index 95% rename from virtualsmartcard/win32/vpcd/Queue.h rename to virtualsmartcard/win32/BixVReader/Queue.h index b258c40..db86e6b 100644 --- a/virtualsmartcard/win32/vpcd/Queue.h +++ b/virtualsmartcard/win32/BixVReader/Queue.h @@ -1,37 +1,36 @@ - -#pragma once - -class ATL_NO_VTABLE CMyQueue : - public CComObjectRootEx, - public IQueueCallbackDeviceIoControl -{ -public: - virtual ~CMyQueue(); - - DECLARE_NOT_AGGREGATABLE(CMyQueue) - - BEGIN_COM_MAP(CMyQueue) - COM_INTERFACE_ENTRY(IQueueCallbackDeviceIoControl) - END_COM_MAP() - - static HRESULT CreateInstance(__in IWDFDevice* pWdfDevice, CMyDevice* pMyDevice); - -protected: - CMyQueue(); - -// COM Interface methods -public: - int state; - // IQueueCallbackDeviceIoControl - STDMETHOD_ (void, OnDeviceIoControl)( - __in IWDFIoQueue* pQueue, - __in IWDFIoRequest* pRequest, - __in ULONG ControlCode, - SIZE_T InputBufferSizeInBytes, - SIZE_T OutputBufferSizeInBytes - ); - -private: - CMyDevice* m_pParentDevice; // Parent device object -}; - + +#pragma once + +class ATL_NO_VTABLE CMyQueue : + public CComObjectRootEx, + public IQueueCallbackDeviceIoControl +{ +public: + virtual ~CMyQueue(); + + DECLARE_NOT_AGGREGATABLE(CMyQueue) + + BEGIN_COM_MAP(CMyQueue) + COM_INTERFACE_ENTRY(IQueueCallbackDeviceIoControl) + END_COM_MAP() + + static HRESULT CreateInstance(__in IWDFDevice* pWdfDevice, CMyDevice* pMyDevice); + +protected: + CMyQueue(); + +// COM Interface methods +public: + // IQueueCallbackDeviceIoControl + STDMETHOD_ (void, OnDeviceIoControl)( + __in IWDFIoQueue* pQueue, + __in IWDFIoRequest* pRequest, + __in ULONG ControlCode, + SIZE_T InputBufferSizeInBytes, + SIZE_T OutputBufferSizeInBytes + ); + +private: + CMyDevice* m_pParentDevice; // Parent device object +}; + diff --git a/virtualsmartcard/win32/BixVReader/Reader.cpp b/virtualsmartcard/win32/BixVReader/Reader.cpp new file mode 100644 index 0000000..b8aad4f --- /dev/null +++ b/virtualsmartcard/win32/BixVReader/Reader.cpp @@ -0,0 +1,426 @@ +#include "internal.h" +#include "VirtualSCReader.h" +#include "reader.h" +#include "device.h" +#include +#include "memory.h" +#include +#include "SectionLocker.h" + +void Reader::init(wchar_t *section) { + section; + state=SCARD_ABSENT; +} + +void Reader::IoSmartCardIsPresent(IWDFIoRequest* pRequest,SIZE_T inBufSize,SIZE_T outBufSize) { + UNREFERENCED_PARAMETER(inBufSize); + UNREFERENCED_PARAMETER(outBufSize); + + OutputDebugString(L"[BixVReader][IPRE]IOCTL_SMARTCARD_IS_PRESENT"); + if (CheckATR()) { + // there's a smart card present, so complete the request + SectionLocker lock(device->m_RequestLock); + pRequest->CompleteWithInformation(STATUS_SUCCESS, 0); + } + else { + // there's no smart card present, so leave the request pending; it will be completed later + SectionLocker lock(device->m_RequestLock); + waitInsertIpr=pRequest; + IRequestCallbackCancel *callback; + device->QueryInterface(__uuidof(IRequestCallbackCancel),(void**)&callback); + pRequest->MarkCancelable(callback); + callback->Release(); + } +} + +void Reader::IoSmartCardGetState(IWDFIoRequest* pRequest,SIZE_T inBufSize,SIZE_T outBufSize) { + UNREFERENCED_PARAMETER(inBufSize); + UNREFERENCED_PARAMETER(outBufSize); + OutputDebugString(L"[BixVReader][GSTA]IOCTL_SMARTCARD_GET_STATE"); + wchar_t log[300]; + swprintf(log,L"[BixVReader]STATE:%08X",state); + OutputDebugString(log); + setInt(device,pRequest,state); +} +void Reader::IoSmartCardIsAbsent(IWDFIoRequest* pRequest,SIZE_T inBufSize,SIZE_T outBufSize) { + UNREFERENCED_PARAMETER(inBufSize); + UNREFERENCED_PARAMETER(outBufSize); + OutputDebugString(L"[BixVReader][IABS]IOCTL_SMARTCARD_IS_ABSENT"); + if (!CheckATR()) { + // there's no smart card present, so complete the request + SectionLocker lock(device->m_RequestLock); + pRequest->CompleteWithInformation(STATUS_SUCCESS, 0); + } + else { + SectionLocker lock(device->m_RequestLock); + // there's a smart card present, so leave the request pending; it will be completed later + waitRemoveIpr=pRequest; + IRequestCallbackCancel *callback; + + device->QueryInterface(__uuidof(IRequestCallbackCancel),(void**)&callback); + pRequest->MarkCancelable(callback); + callback->Release(); + } +} + +void Reader::IoSmartCardPower(IWDFIoRequest* pRequest,SIZE_T inBufSize,SIZE_T outBufSize) { + UNREFERENCED_PARAMETER(inBufSize); + UNREFERENCED_PARAMETER(outBufSize); + OutputDebugString(L"[BixVReader][POWR]IOCTL_SMARTCARD_POWER"); + DWORD code=getInt(pRequest); + if (code==SCARD_COLD_RESET) { + OutputDebugString(L"[BixVReader][POWR]SCARD_COLD_RESET"); + protocol=0; + powered=1; + state=SCARD_NEGOTIABLE; + } + else if (code==SCARD_WARM_RESET) { + OutputDebugString(L"[BixVReader][POWR]SCARD_WARM_RESET"); + protocol=0; + powered=1; + state=SCARD_NEGOTIABLE; + } + else if (code==SCARD_POWER_DOWN) { + OutputDebugString(L"[BixVReader][POWR]SCARD_POWER_DOWN"); + protocol=0; + powered=0; + state=SCARD_SWALLOWED; + } + if (code==SCARD_COLD_RESET || code==SCARD_WARM_RESET) { + BYTE ATR[100]; + DWORD ATRsize; + if (!QueryATR(ATR,&ATRsize,true)) + { + pRequest->CompleteWithInformation(STATUS_NO_MEDIA, 0); + return; + } + setBuffer(device,pRequest,ATR,ATRsize); + } + else { + SectionLocker lock(device->m_RequestLock); + pRequest->CompleteWithInformation(STATUS_SUCCESS, 0); + } + +} + +void Reader::IoSmartCardSetProtocol(IWDFIoRequest* pRequest,SIZE_T inBufSize,SIZE_T outBufSize) { + UNREFERENCED_PARAMETER(inBufSize); + UNREFERENCED_PARAMETER(outBufSize); + UNREFERENCED_PARAMETER(instance); + + DWORD requestedProtocol=getInt(pRequest); + wchar_t log[300]; + swprintf(log,L"[BixVReader][SPRT]IOCTL_SMARTCARD_SET_PROTOCOL:%08X",requestedProtocol); + OutputDebugString(log); + + BYTE ATR[100]; + DWORD ATRsize; + state=SCARD_SPECIFIC; + if (!QueryATR(ATR,&ATRsize,true)) + { + SectionLocker lock(device->m_RequestLock); + pRequest->CompleteWithInformation(STATUS_NO_MEDIA, 0); + return; + } + + if (((requestedProtocol & SCARD_PROTOCOL_T1) != 0) && + ((availableProtocol & SCARD_PROTOCOL_T1) != 0)) { + protocol = SCARD_PROTOCOL_T1; + SectionLocker lock(device->m_RequestLock); + pRequest->CompleteWithInformation(STATUS_SUCCESS, 0); + OutputDebugString(L"[BixVReader]PROTOCOL SET: T1"); + return; + } + + if (((requestedProtocol & SCARD_PROTOCOL_T0) != 0) && + ((availableProtocol & SCARD_PROTOCOL_T0) != 0)) { + protocol = SCARD_PROTOCOL_T0; + SectionLocker lock(device->m_RequestLock); + pRequest->CompleteWithInformation(STATUS_SUCCESS, 0); + OutputDebugString(L"[BixVReader]PROTOCOL SET: T0"); + return; + } + + if (((requestedProtocol & (SCARD_PROTOCOL_DEFAULT)) != 0) && + ((availableProtocol & SCARD_PROTOCOL_T1) != 0)) { + protocol = SCARD_PROTOCOL_T1; + SectionLocker lock(device->m_RequestLock); + pRequest->CompleteWithInformation(STATUS_SUCCESS, 0); + OutputDebugString(L"[BixVReader]PROTOCOL SET: T1"); + return; + } + + if (((requestedProtocol & (SCARD_PROTOCOL_DEFAULT)) != 0) && + ((availableProtocol & SCARD_PROTOCOL_T0) != 0)) { + protocol = SCARD_PROTOCOL_T0; + SectionLocker lock(device->m_RequestLock); + pRequest->CompleteWithInformation(STATUS_SUCCESS, 0); + OutputDebugString(L"[BixVReader]PROTOCOL SET: T0"); + return; + } + { + state=SCARD_NEGOTIABLE; + SectionLocker lock(device->m_RequestLock); + pRequest->CompleteWithInformation(HRESULT_FROM_WIN32(ERROR_NOT_SUPPORTED), 0); + } +} + + void Reader::IoSmartCardSetAttribute(IWDFIoRequest* pRequest,SIZE_T inBufSize,SIZE_T outBufSize) { + UNREFERENCED_PARAMETER(inBufSize); + UNREFERENCED_PARAMETER(outBufSize); + UNREFERENCED_PARAMETER(instance); + OutputDebugString(L"[BixVReader][SATT]IOCTL_SMARTCARD_SET_ATTRIBUTE"); + + IWDFMemory *inmem=NULL; + pRequest->GetInputMemory(&inmem); + + SIZE_T size; + BYTE *data=(BYTE *)inmem->GetDataBuffer(&size); + + DWORD minCode=*(DWORD*)(data); + bool handled=false; + if (minCode==SCARD_ATTR_DEVICE_IN_USE) { + SectionLocker lock(device->m_RequestLock); + OutputDebugString(L"[BixVReader][SATT]SCARD_ATTR_DEVICE_IN_USE"); + pRequest->CompleteWithInformation(STATUS_SUCCESS, 0); + handled=true; + } + inmem->Release(); + if (!handled) { + SectionLocker lock(device->m_RequestLock); + wchar_t log[300]; + swprintf(log,L"[BixVReader][SATT]ERROR_NOT_SUPPORTED:%08X",minCode); + OutputDebugString(log); + pRequest->CompleteWithInformation(HRESULT_FROM_WIN32(ERROR_NOT_SUPPORTED), 0); + } +} + +void Reader::IoSmartCardTransmit(IWDFIoRequest* pRequest,SIZE_T inBufSize,SIZE_T outBufSize) { + UNREFERENCED_PARAMETER(inBufSize); + UNREFERENCED_PARAMETER(outBufSize); + OutputDebugString(L"[BixVReader][TRSM]IOCTL_SMARTCARD_TRANSMIT"); + BYTE APDU[1000]; + int APDUSize; + getBuffer(pRequest,APDU,&APDUSize); + if (((SCARD_IO_REQUEST*)APDU)->dwProtocol!=protocol) { + SectionLocker lock(device->m_RequestLock); + pRequest->CompleteWithInformation(STATUS_INVALID_DEVICE_STATE, 0); + return; + } + BYTE Resp[1000]; + int RespSize; + if (!QueryTransmit(APDU+sizeof(SCARD_IO_REQUEST),APDUSize-sizeof(SCARD_IO_REQUEST),Resp+sizeof(SCARD_IO_REQUEST),&RespSize)) + { + SectionLocker lock(device->m_RequestLock); + pRequest->CompleteWithInformation(STATUS_NO_MEDIA, 0); + return; + } + ((SCARD_IO_REQUEST*)Resp)->cbPciLength=sizeof(SCARD_IO_REQUEST); + ((SCARD_IO_REQUEST*)Resp)->dwProtocol=protocol; + setBuffer(device,pRequest,Resp,RespSize+sizeof(SCARD_IO_REQUEST)); +} + +void Reader::IoSmartCardGetAttribute(IWDFIoRequest* pRequest,SIZE_T inBufSize,SIZE_T outBufSize) { + UNREFERENCED_PARAMETER(inBufSize); + + wchar_t log[300]=L""; + char temp[300]; + + DWORD code=getInt(pRequest); + swprintf(log,L"[BixVReader][GATT] - code %0X",code); + OutputDebugString(log); + + switch(code) { + case SCARD_ATTR_VALUE(SCARD_CLASS_VENDOR_DEFINED, 0xA009): + // custom attribute; RPC_TYPE + OutputDebugString(L"[BixVReader][GATT]RPC_TYPE"); + setInt(device,pRequest,rpcType); + return; + case SCARD_ATTR_VALUE(SCARD_CLASS_VENDOR_DEFINED, 0xA00a): + // custom attribute; PipeName + if (rpcType==0) { + PipeReader *pipe=(PipeReader *)this; + OutputDebugString(L"[BixVReader][GATT]PIPE_NAME"); + sprintf(temp,"%S",pipe->pipeName); + setString(device,pRequest,(char*)temp,(int)outBufSize); + } + else { + SectionLocker lock(device->m_RequestLock); + pRequest->CompleteWithInformation(HRESULT_FROM_WIN32(ERROR_NOT_SUPPORTED), 0); + } + return; + case SCARD_ATTR_VALUE(SCARD_CLASS_VENDOR_DEFINED, 0xA00b): + // custom attribute; EventPipeName + if (rpcType==0) { + PipeReader *pipe=(PipeReader *)this; + OutputDebugString(L"[BixVReader][GATT]EVENT_PIPE_NAME"); + sprintf(temp,"%S",pipe->pipeEventName); + setString(device,pRequest,(char*)temp,(int)outBufSize); + } + else { + SectionLocker lock(device->m_RequestLock); + pRequest->CompleteWithInformation(HRESULT_FROM_WIN32(ERROR_NOT_SUPPORTED), 0); + } + return; + case SCARD_ATTR_VALUE(SCARD_CLASS_VENDOR_DEFINED, 0xA00c): + // custom attribute; TCP port + if (rpcType==1) { + TcpIpReader *tcpIp=(TcpIpReader *)this; + OutputDebugString(L"[BixVReader][GATT]PORT"); + setInt(device,pRequest,tcpIp->port); + } + else { + SectionLocker lock(device->m_RequestLock); + pRequest->CompleteWithInformation(HRESULT_FROM_WIN32(ERROR_NOT_SUPPORTED), 0); + } + return; + case SCARD_ATTR_VALUE(SCARD_CLASS_VENDOR_DEFINED, 0xA00d): + // custom attribute; TCP event port + if (rpcType==1) { + TcpIpReader *tcpIp=(TcpIpReader *)this; + OutputDebugString(L"[BixVReader][GATT]EVENT_PORT"); + setInt(device,pRequest,tcpIp->eventPort); + } + else { + SectionLocker lock(device->m_RequestLock); + pRequest->CompleteWithInformation(HRESULT_FROM_WIN32(ERROR_NOT_SUPPORTED), 0); + } + return; + case SCARD_ATTR_VALUE(SCARD_CLASS_VENDOR_DEFINED, 0xA00e): + // custom attribute; TCP base port + if (rpcType==1) { + TcpIpReader *tcpIp=(TcpIpReader *)this; + OutputDebugString(L"[BixVReader][GATT]BASE_PORT"); + setInt(device,pRequest,tcpIp->portBase); + tcpIp; + } + else { + SectionLocker lock(device->m_RequestLock); + pRequest->CompleteWithInformation(HRESULT_FROM_WIN32(ERROR_NOT_SUPPORTED), 0); + } + return; + case SCARD_ATTR_CHARACTERISTICS: + // 0x00000000 No special characteristics + OutputDebugString(L"[BixVReader][GATT]SCARD_ATTR_CHARACTERISTICS"); + setInt(device,pRequest,0); + return; + case SCARD_ATTR_VENDOR_NAME: + OutputDebugString(L"[BixVReader][GATT]SCARD_ATTR_VENDOR_NAME"); + setString(device,pRequest,vendorName,(int)outBufSize); + return; + case SCARD_ATTR_VENDOR_IFD_TYPE: + OutputDebugString(L"[BixVReader][GATT]SCARD_ATTR_VENDOR_IFD_TYPE"); + setString(device,pRequest,vendorIfdType,(int)outBufSize); + return; + case SCARD_ATTR_DEVICE_UNIT: + OutputDebugString(L"[BixVReader][GATT]SCARD_ATTR_DEVICE_UNIT"); + setInt(device,pRequest,deviceUnit); + return; + case SCARD_ATTR_ATR_STRING: + OutputDebugString(L"[BixVReader][GATT]SCARD_ATTR_ATR_STRING"); + BYTE ATR[100]; + DWORD ATRsize; + if (!QueryATR(ATR,&ATRsize)) + { + SectionLocker lock(device->m_RequestLock); + pRequest->CompleteWithInformation(STATUS_NO_MEDIA, 0); + return; + } + setBuffer(device,pRequest,ATR,ATRsize); + return; + case SCARD_ATTR_CURRENT_PROTOCOL_TYPE: + OutputDebugString(L"[BixVReader][GATT]SCARD_ATTR_CURRENT_PROTOCOL_TYPE"); + setInt(device,pRequest,protocol); // T=0 or T=1 + return; + default: { + swprintf(log,L"[BixVReader][GATT]ERROR_NOT_SUPPORTED:%08X",code); + OutputDebugString(log); + SectionLocker lock(device->m_RequestLock); + pRequest->CompleteWithInformation(HRESULT_FROM_WIN32(ERROR_NOT_SUPPORTED), 0); + } + } +} + +bool Reader::CheckATR() { + return false; +} + +bool Reader::QueryTransmit(BYTE *APDU,int APDUlen,BYTE *Resp,int *Resplen) { + APDU; + APDUlen; + Resp; + Resplen; + return false; +} + +bool Reader::QueryATR(BYTE *ATR,DWORD *ATRsize,bool reset) { + ATR; + ATRsize; + reset; + return false; +} + +bool Reader::initProtocols() { + // ask ATR to determine available protocols + BYTE ATR[100]; + DWORD ATRsize=100; + availableProtocol=0; + if (QueryATR(ATR,&ATRsize,true)) + { + availableProtocol=0; + int iNumHistBytes=0; + int iTotHistBytes=0; + int y=0; + int block=1; + bool isHist=false; + char let='A'; + for (unsigned int i=0;i> 4; + iTotHistBytes=ATR[i] & 0xF; + } + else { + while ((y & 1)==0) { + let++; + y>>=1; + if (y==0) { + isHist=true; + iNumHistBytes=1; + i--; + goto end; + } + } + // we are in T(let)(block) + y=y & 0xE; + if (let=='D') { + // check available protocol(s) + int protocol=(ATR[i] & 0x0f); + availableProtocol|=1 << protocol; + // prepare for next block + let='A'; + y=ATR[i] >> 4; + block++; + } + } +end: + ; + } + //support at least T=0 + if (availableProtocol==0) + availableProtocol=1; + return true; + } + return false; +} + +DWORD Reader::startServer() { + return 0; +} + +void Reader::shutdown() { +} diff --git a/virtualsmartcard/win32/BixVReader/Reader.h b/virtualsmartcard/win32/BixVReader/Reader.h new file mode 100644 index 0000000..733acd9 --- /dev/null +++ b/virtualsmartcard/win32/BixVReader/Reader.h @@ -0,0 +1,104 @@ +#pragma once + +#include + +class CMyDevice; + +class Reader { +public: + CMyDevice *device; + CComPtr waitRemoveIpr; + CComPtr waitInsertIpr; + inbuf; + outbuf; + + HANDLE serverThread; + + char vendorName[300]; + char vendorIfdType[300]; + int deviceUnit; + int powered; + int instance; + int rpcType; + int state; + DWORD protocol; // T0 or T1 - protocol in use + DWORD availableProtocol; // T0, T1 or Both - protocols available + + void IoSmartCardGetAttribute(IWDFIoRequest* pRequest,SIZE_T inBufSize,SIZE_T outBufSize); + void IoSmartCardIsPresent(IWDFIoRequest* pRequest,SIZE_T inBufSize,SIZE_T outBufSize); + void IoSmartCardGetState(IWDFIoRequest* pRequest,SIZE_T inBufSize,SIZE_T outBufSize); + void IoSmartCardIsAbsent(IWDFIoRequest* pRequest,SIZE_T inBufSize,SIZE_T outBufSize); + void IoSmartCardPower(IWDFIoRequest* pRequest,SIZE_T inBufSize,SIZE_T outBufSize); + void IoSmartCardSetAttribute(IWDFIoRequest* pRequest,SIZE_T inBufSize,SIZE_T outBufSize); + void IoSmartCardSetProtocol(IWDFIoRequest* pRequest,SIZE_T inBufSize,SIZE_T outBufSize); + void IoSmartCardTransmit(IWDFIoRequest* pRequest,SIZE_T inBufSize,SIZE_T outBufSize); + + bool initProtocols(); + virtual bool QueryTransmit(BYTE *APDU,int APDUlen,BYTE *Resp,int *Resplen); + virtual bool QueryATR(BYTE *ATR,DWORD *ATRsize,bool reset=false); + virtual bool CheckATR(); + virtual DWORD startServer(); + virtual void shutdown(); + virtual void init(wchar_t *section); + +}; + +class PipeReader : public Reader { +public: + wchar_t pipeName[300]; + wchar_t pipeEventName[300]; + HANDLE pipe; + HANDLE eventpipe; + + PipeReader(); + bool QueryTransmit(BYTE *APDU,int APDUlen,BYTE *Resp,int *Resplen); + bool QueryATR(BYTE *ATR,DWORD *ATRsize,bool reset=false); + bool CheckATR(); + DWORD startServer(); + void shutdown(); + void init(wchar_t *section); + + CRITICAL_SECTION eventSection; + CRITICAL_SECTION dataSection; +}; + +class TcpIpReader : public Reader { +public: + static int portBase; + int port; + int eventPort; + SOCKET socket; + SOCKET AcceptSocket; + SOCKET eventsocket; + bool breakSocket; + + TcpIpReader(); + bool QueryTransmit(BYTE *APDU,int APDUlen,BYTE *Resp,int *Resplen); + bool QueryATR(BYTE *ATR,DWORD *ATRsize,bool reset=false); + bool CheckATR(); + DWORD startServer(); + void shutdown(); + void init(wchar_t *section); + + CRITICAL_SECTION eventSection; + CRITICAL_SECTION dataSection; +}; + +class VpcdReader : public Reader { +public: + static int portBase; + short port; + void *ctx; + bool breakSocket; + bool cardPresent; + + VpcdReader(); + bool QueryTransmit(BYTE *APDU,int APDUlen,BYTE *Resp,int *Resplen); + bool QueryATR(BYTE *ATR,DWORD *ATRsize,bool reset=false); + bool CheckATR(); + DWORD startServer(); + void shutdown(); + void init(wchar_t *section); + void signalRemoval(void); + void signalInsertion(void); +}; diff --git a/virtualsmartcard/win32/BixVReader/TcpIpReader.cpp b/virtualsmartcard/win32/BixVReader/TcpIpReader.cpp new file mode 100644 index 0000000..1ac002b --- /dev/null +++ b/virtualsmartcard/win32/BixVReader/TcpIpReader.cpp @@ -0,0 +1,306 @@ +#include "internal.h" +#include "VirtualSCReader.h" +#include "reader.h" +#include "device.h" +#include +#include "memory.h" +#include +#include "sectionLocker.h" + + +int TcpIpReader::portBase; + +TcpIpReader::TcpIpReader() { + rpcType=1; + state=SCARD_ABSENT; +} +void TcpIpReader::init(wchar_t *section) { + portBase=GetPrivateProfileInt(L"Driver",L"RPC_PORT_BASE",29500,L"BixVReader.ini"); + + port=GetPrivateProfileInt(section,L"TCP_PORT",portBase+(instance<<1),L"BixVReader.ini"); + eventPort=GetPrivateProfileInt(section,L"TCP_EVENT_PORT",portBase+1+(instance<<1),L"BixVReader.ini"); + + InitializeCriticalSection(&eventSection); + InitializeCriticalSection(&dataSection); +} + +bool TcpIpReader::CheckATR() { + //SectionLocker lock(dataSection); + if (AcceptSocket==NULL) + return false; + int read=0; + DWORD command=1; + if ((read=send(AcceptSocket,(char*)&command,sizeof(DWORD),NULL))<=0) { + return false; + } + DWORD size=0; + if ((read=recv(AcceptSocket,(char*)&size,sizeof(DWORD),MSG_WAITALL))<=0) { + return false; + } + if (size==0) + return false; + BYTE ATR[100]; + if ((read=recv(AcceptSocket,(char*)ATR,size,MSG_WAITALL))<=0) { + return false; + } + return true; +} +bool TcpIpReader::QueryTransmit(BYTE *APDU,int APDUlen,BYTE *Resp,int *Resplen) { + //SectionLocker lock(dataSection); + if (AcceptSocket==NULL) + return false; + DWORD command=2; + DWORD read=0; + if ((read=send(AcceptSocket,(char*)&command,sizeof(DWORD),NULL))<=0) { + ::shutdown(AcceptSocket,SD_BOTH); + AcceptSocket=NULL; + return false; + } + DWORD dwAPDUlen=(DWORD)APDUlen; + if ((read=send(AcceptSocket,(char*)&dwAPDUlen,sizeof(DWORD),NULL))<=0) { + ::shutdown(AcceptSocket,SD_BOTH); + AcceptSocket=NULL; + return false; + } + if ((read=send(AcceptSocket,(char*)APDU,APDUlen,NULL))<=0) { + ::shutdown(AcceptSocket,SD_BOTH); + AcceptSocket=NULL; + return false; + } + DWORD dwRespLen=0; + if ((read=recv(AcceptSocket,(char*)&dwRespLen,sizeof(DWORD),MSG_WAITALL))<=0) { + ::shutdown(AcceptSocket,SD_BOTH); + AcceptSocket=NULL; + return false; + } + if ((read=recv(AcceptSocket,(char*)Resp,dwRespLen,MSG_WAITALL))<=0) { + ::shutdown(AcceptSocket,SD_BOTH); + AcceptSocket=NULL; + return false; + } + (*Resplen)=(int)dwRespLen; + return true; +} + +bool TcpIpReader::QueryATR(BYTE *ATR,DWORD *ATRsize,bool reset) { + //SectionLocker lock(dataSection); + if (AcceptSocket==NULL) + return false; + int read=0; + DWORD command=reset ? 0 : 1; + if ((read=send(AcceptSocket,(char*)&command,sizeof(DWORD),NULL))<=0) { + ::shutdown(AcceptSocket,SD_BOTH); + AcceptSocket=NULL; + return false; + } + DWORD size=0; + if ((read=recv(AcceptSocket,(char*)&size,sizeof(DWORD),MSG_WAITALL))<=0) { + ::shutdown(AcceptSocket,SD_BOTH); + AcceptSocket=NULL; + return false; + } + if (size==0) + return false; + if ((read=recv(AcceptSocket,(char*)ATR,size,MSG_WAITALL))<=0) { + ::shutdown(AcceptSocket,SD_BOTH); + AcceptSocket=NULL; + return false; + } + (*ATRsize)=size; + return true; +} + +DWORD TcpIpReader::startServer() { + breakSocket=false; + + wchar_t log[300]; + while (true) { + //__try { + fd_set readfds; + + FD_ZERO(&readfds); + // Set server socket to set + FD_SET(socket, &readfds); + + // Timeout parameter + timeval tv = { 0 }; + tv.tv_sec = 5; + + while(true) { + if (breakSocket) + return 0; + FD_SET(socket, &readfds); + int ret = select(0, &readfds, NULL, NULL, &tv); + if (ret > 0) + break; + if (ret<0) { + wchar_t log[100]; + DWORD err=WSAGetLastError(); + swprintf(log,L"[BixVReader]wsa err:%x",err); + OutputDebugString(log); + if (err==0x2736) { + socket=WSASocket(AF_INET,SOCK_STREAM,IPPROTO_TCP,NULL,0,0); + sockaddr_in Service; + Service.sin_family = AF_INET; + Service.sin_addr.s_addr = inet_addr("127.0.0.1"); + Service.sin_port = htons((u_short)(port)); + bind(socket, (SOCKADDR *) &Service, sizeof (Service)); + listen(socket, 1); + + FD_ZERO(&readfds); + // Set server socket to set + FD_SET(socket, &readfds); + } + } + } + + SOCKET AcceptEventSocket; + + AcceptSocket = accept(socket, NULL, NULL); + closesocket(socket); + socket=NULL; + if (AcceptSocket == INVALID_SOCKET) + return 0; + + swprintf(log,L"[BixVReader]Socket connected:%i",AcceptSocket); + OutputDebugString(log); + + FD_ZERO(&readfds); + // Set server socket to set + FD_SET(eventsocket, &readfds); + + while(true) { + if (breakSocket) + return 0; + FD_SET(eventsocket, &readfds); + int ret = select(0, &readfds, NULL, NULL, &tv); + if (ret > 0) + break; + if (ret<0) { + DWORD err=WSAGetLastError(); + swprintf(log,L"[BixVReader]wsa err:%x",err); + OutputDebugString(log); + if (err==0x2736) { + eventsocket=WSASocket(AF_INET,SOCK_STREAM,IPPROTO_TCP,NULL,0,0); + sockaddr_in eventService; + eventService.sin_family = AF_INET; + eventService.sin_addr.s_addr = inet_addr("127.0.0.1"); + eventService.sin_port = htons((u_short)(eventPort)); + bind(eventsocket, (SOCKADDR *) &eventService, sizeof (eventService)); + listen(eventsocket, 1); + + FD_ZERO(&readfds); + // Set server socket to set + FD_SET(eventsocket, &readfds); + } + } + } + + AcceptEventSocket = accept(eventsocket, NULL, NULL); + closesocket(eventsocket); + eventsocket=NULL; + if (AcceptEventSocket == INVALID_SOCKET) + return 0; + + swprintf(log,L"[BixVReader]Event Socket connected:%i",AcceptEventSocket); + OutputDebugString(log); + + if (waitInsertIpr!=NULL) { + // if I'm waiting for card insertion, verify if there's a card present + if (initProtocols()) { + SectionLocker lock(device->m_RequestLock); + if (waitInsertIpr->UnmarkCancelable()==S_OK) + waitInsertIpr->CompleteWithInformation(STATUS_SUCCESS, 0); + waitInsertIpr=NULL; + state=SCARD_SWALLOWED; + } + } + + while (true) { + // wait for a command + DWORD command=0; + int read=0; + if ((read=recv(AcceptEventSocket,(char*)&command,sizeof(DWORD),MSG_WAITALL))<=0) { + state=SCARD_ABSENT; + OutputDebugString(L"[BixVReader]Socket error"); + powered=0; + ::shutdown(AcceptSocket,SD_BOTH); + ::shutdown(AcceptEventSocket,SD_BOTH); + if (waitRemoveIpr!=NULL) {// card inserted + OutputDebugString(L"[BixVReader]complete Wait Remove"); + SectionLocker lock(device->m_RequestLock); + if (waitRemoveIpr->UnmarkCancelable()==S_OK) { + OutputDebugString(L"[BixVReader]Wait Remove Unmarked"); + waitRemoveIpr->CompleteWithInformation(STATUS_SUCCESS, 0); + OutputDebugString(L"[BixVReader]Wait Remove Completed"); + } + waitRemoveIpr=NULL; + } + if (waitInsertIpr!=NULL) {// card removed + OutputDebugString(L"[BixVReader]cancel Wait Remove"); + SectionLocker lock(device->m_RequestLock); + if (waitInsertIpr->UnmarkCancelable()==S_OK) { + OutputDebugString(L"[BixVReader]Wait Insert Unmarked"); + waitInsertIpr->CompleteWithInformation(HRESULT_FROM_WIN32(ERROR_CANCELLED), 0); + OutputDebugString(L"[BixVReader]Wait Insert Cancelled"); + } + waitInsertIpr=NULL; + } + break; + } + OutputDebugString(L"[BixVReader]Socket data"); + if (command==0) + powered=0; + if (command==0 && waitRemoveIpr!=NULL) {// card removed + SectionLocker lock(device->m_RequestLock); + state=SCARD_ABSENT; + if (waitRemoveIpr->UnmarkCancelable()==S_OK) + waitRemoveIpr->CompleteWithInformation(STATUS_SUCCESS, 0); + waitRemoveIpr=NULL; + } + else if (command==1 && waitInsertIpr!=NULL) {// card inserted + SectionLocker lock(device->m_RequestLock); + state=SCARD_SWALLOWED; + initProtocols(); + if (waitInsertIpr->UnmarkCancelable()==S_OK) + waitInsertIpr->CompleteWithInformation(STATUS_SUCCESS, 0); + waitInsertIpr=NULL; + } + } + //} + //__except(EXCEPTION_EXECUTE_HANDLER) { + // wchar_t log[300]; + // DWORD err=GetExceptionCode(); + // swprintf(log,L"Exception:%08X",err); + // OutputDebugString(log); + //} + } + OutputDebugString(L"[BixVReader]Socket quit!!!"); + return 0; +} + +void TcpIpReader::shutdown() { + state=SCARD_ABSENT; + breakSocket=true; + { + //SectionLocker lock(dataSection); + closesocket(eventsocket); + closesocket(socket); + } + WaitForSingleObject(serverThread,10000); + serverThread=NULL; + eventsocket=NULL; + socket=NULL; + if (waitRemoveIpr!=NULL) { + SectionLocker lock(device->m_RequestLock); + if (waitRemoveIpr->UnmarkCancelable()==S_OK) + waitRemoveIpr->Complete(HRESULT_FROM_WIN32(ERROR_CANCELLED)); + waitRemoveIpr=NULL; + } + if (waitInsertIpr!=NULL) { + SectionLocker lock(device->m_RequestLock); + if (waitInsertIpr->UnmarkCancelable()==S_OK) + waitInsertIpr->Complete(HRESULT_FROM_WIN32(ERROR_CANCELLED)); + waitInsertIpr=NULL; + } +} diff --git a/virtualsmartcard/win32/vpcd/VirtualSCReader.idl b/virtualsmartcard/win32/BixVReader/VirtualSCReader.idl similarity index 95% rename from virtualsmartcard/win32/vpcd/VirtualSCReader.idl rename to virtualsmartcard/win32/BixVReader/VirtualSCReader.idl index ee646a7..dacd585 100644 --- a/virtualsmartcard/win32/vpcd/VirtualSCReader.idl +++ b/virtualsmartcard/win32/BixVReader/VirtualSCReader.idl @@ -1,20 +1,20 @@ -import "wudfddi.idl"; - -[ - uuid(8B9C88E9-7E63-46c7-832B-D48D0290E4BF), - version(1.0), - helpstring("VirtualSCReader Driver Type Library") -] -library VirtualSCReaderDriverLib -{ - importlib("stdole2.tlb"); - [ - uuid(d4112073-d09b-458f-a5aa-35ef21eef5de), - //uuid(10654262-B9BD-4636-8890-F66362CCC207), - helpstring("VirtualSCReader Class") - ] - coclass VirtualSCReaderDriver - { - [default] interface IDriverEntry; - }; -}; +import "wudfddi.idl"; + +[ + uuid(8B9C88E9-7E63-46c7-832B-D48D0290E4BF), + version(1.0), + helpstring("VirtualSCReader Driver Type Library") +] +library VirtualSCReaderDriverLib +{ + importlib("stdole2.tlb"); + [ + uuid(d4112073-d09b-458f-a5aa-35ef21eef5de), + //uuid(10654262-B9BD-4636-8890-F66362CCC207), + helpstring("VirtualSCReader Class") + ] + coclass VirtualSCReaderDriver + { + [default] interface IDriverEntry; + }; +}; diff --git a/virtualsmartcard/win32/BixVReader/VpcdReader.cpp b/virtualsmartcard/win32/BixVReader/VpcdReader.cpp new file mode 100644 index 0000000..a94eb9c --- /dev/null +++ b/virtualsmartcard/win32/BixVReader/VpcdReader.cpp @@ -0,0 +1,147 @@ +#include "internal.h" +#include "VirtualSCReader.h" +#include "reader.h" +#include "device.h" +#include +#include "memory.h" +#include +#include "sectionLocker.h" +#include "../../src/vpcd/vpcd.h" + + +int VpcdReader::portBase; + +VpcdReader::VpcdReader() { + rpcType=2; + state=SCARD_ABSENT; + cardPresent = false; +} +void VpcdReader::init(wchar_t *section) { + portBase=GetPrivateProfileInt(L"Driver",L"RPC_PORT_BASE",VPCDPORT,L"BixVReader.ini"); + + port=(short) GetPrivateProfileInt(section,L"TCP_PORT",portBase+instance,L"BixVReader.ini"); +} + +bool VpcdReader::CheckATR() { + bool r = false; + struct vicc_ctx *vicc_ctx = (struct vicc_ctx *) ctx; + + if (vicc_present((struct vicc_ctx *) ctx) == 1) { + signalInsertion(); + r = true; + } else { + signalRemoval(); + } + + return r; +} +bool VpcdReader::QueryTransmit(BYTE *APDU,int APDUlen,BYTE *Resp,int *Resplen) { + unsigned char *rapdu = NULL; + ssize_t rapdu_len; + bool r = false; + + if (APDU && APDUlen && Resp && Resplen) { + rapdu_len = vicc_transmit((struct vicc_ctx *) ctx, APDUlen, APDU, &rapdu); + if (rapdu_len > 0) { + memcpy(Resp, rapdu, rapdu_len); + *Resplen = rapdu_len; + free(rapdu); + r = true; + } else { + signalRemoval(); + } + } + + return r; +} + +bool VpcdReader::QueryATR(BYTE *ATR,DWORD *ATRsize,bool reset) { + unsigned char *atr = NULL; + int atr_len; + bool r = false; + + if (ATR && ATRsize) { + atr_len = vicc_getatr((struct vicc_ctx *) ctx, &atr); + if (atr_len > 0) { + /* TODO do length checking on length of ATR when ATRsize is + * correctly initialized by Reader.cpp */ + memcpy(ATR, atr, atr_len); + *ATRsize = atr_len; + free(atr); + r = true; + if (reset) + vicc_reset((struct vicc_ctx *) ctx); + } else { + signalRemoval(); + } + } + + return r; +} + +DWORD VpcdReader::startServer() { + breakSocket = false; + ctx = vicc_init(NULL, port); + while (!breakSocket) { + CheckATR(); + Sleep(1000); + } + return 0; +} + +void VpcdReader::shutdown() { + breakSocket=true; + WaitForSingleObject(serverThread,10000); + serverThread=NULL; + vicc_exit((struct vicc_ctx *) ctx); + state=SCARD_ABSENT; + ctx = NULL; + if (waitRemoveIpr!=NULL) { + SectionLocker lock(device->m_RequestLock); + if (waitRemoveIpr->UnmarkCancelable()==S_OK) + waitRemoveIpr->Complete(HRESULT_FROM_WIN32(ERROR_CANCELLED)); + waitRemoveIpr=NULL; + } + if (waitInsertIpr!=NULL) { + SectionLocker lock(device->m_RequestLock); + if (waitInsertIpr->UnmarkCancelable()==S_OK) + waitInsertIpr->Complete(HRESULT_FROM_WIN32(ERROR_CANCELLED)); + waitInsertIpr=NULL; + } +} + +void VpcdReader::signalRemoval(void) { + if (cardPresent) { + cardPresent = false; + state=SCARD_ABSENT; + if (waitRemoveIpr!=NULL) { + SectionLocker lock(device->m_RequestLock); + if (waitRemoveIpr->UnmarkCancelable()==S_OK) { + waitRemoveIpr->CompleteWithInformation(STATUS_SUCCESS, 0); + } + waitRemoveIpr=NULL; + } + if (waitInsertIpr!=NULL) { + SectionLocker lock(device->m_RequestLock); + if (waitInsertIpr->UnmarkCancelable()==S_OK) { + waitInsertIpr->CompleteWithInformation(HRESULT_FROM_WIN32(ERROR_CANCELLED), 0); + } + waitInsertIpr=NULL; + } + } +} + +void VpcdReader::signalInsertion(void) { + if (!cardPresent) { + cardPresent = true; + if (waitInsertIpr!=NULL) { + if (initProtocols()) { + SectionLocker lock(device->m_RequestLock); + if (waitInsertIpr->UnmarkCancelable()==S_OK) + waitInsertIpr->CompleteWithInformation(STATUS_SUCCESS, 0); + waitInsertIpr=NULL; + state=SCARD_SWALLOWED; + } + } + } +} diff --git a/virtualsmartcard/win32/vpcd/vpcd.inx b/virtualsmartcard/win32/BixVReader/Win7/BixVReader.inx similarity index 74% rename from virtualsmartcard/win32/vpcd/vpcd.inx rename to virtualsmartcard/win32/BixVReader/Win7/BixVReader.inx index 9a87936..1e16728 100644 --- a/virtualsmartcard/win32/vpcd/vpcd.inx +++ b/virtualsmartcard/win32/BixVReader/Win7/BixVReader.inx @@ -1,80 +1,80 @@ -; -; VirtualCardReader.inf -; - -[Version] -Signature="$Windows NT$" -Class=SmartCardReader -ClassGuid={50dd5230-ba8a-11d1-bf5d-0000f805f530} -Provider=%MSFTUMDF% -CatalogFile=WUDF.cat -DriverVer=11/22/2010,6.1.7600.16385 - -[Manufacturer] -%MSFTUMDF%=Microsoft,NT$ARCH$ - -[Microsoft.NT$ARCH$] -%ReaderDeviceName%=VReader_Install,root\vpcd - -; =================== Virtual Reader Device ================================== - -[VReader_Install.NT] -CopyFiles=UMDriverCopy - -[VReader_Install.NT.hw] - -[VReader_Install.NT.Services] -AddService=WUDFRd,0x000001fa,WUDFRD_ServiceInstall - -[VReader_Install.NT.CoInstallers] -AddReg=CoInstallers_AddReg -CopyFiles=CoInstallers_CopyFiles - -[VReader_Install.NT.Wdf] -UmdfService=vpcd,UMDFVReader_Install -UmdfServiceOrder=vpcd -UmdfKernelModeClientPolicy=AllowKernelModeClients - -; =================== UMDF Service Install section =================== - -[UMDFVReader_Install] -UmdfLibraryVersion=$UMDFVERSION$ -ServiceBinary=%12%\UMDF\vpcd.dll -DriverCLSID={d4112073-d09b-458f-a5aa-35ef21eef5de} - -[WUDFRD_ServiceInstall] -DisplayName = %WudfRdDisplayName% -ServiceType = 1 -StartType = 3 -ErrorControl = 1 -ServiceBinary = %12%\WUDFRd.sys -LoadOrderGroup = Base - -[SourceDisksFiles] -vpcd.dll=1 -WudfUpdate_01009.dll=1 - -[SourceDisksNames] -1 = %MediaDescription% - -[CoInstallers_CopyFiles] -WudfUpdate_$UMDFCOINSTALLERVERSION$.dll - -[CoInstallers_AddReg] -HKR,,CoInstallers32,0x00010000,"WUDFUpdate_$UMDFCOINSTALLERVERSION$.dll" - -[DestinationDirs] -UMDriverCopy=12,UMDF ; copy to driversMdf -CoInstallers_CopyFiles=11 - -[UMDriverCopy] -vpcd.dll - -; =================== Generic ================================== - -[Strings] -MSFTUMDF="Virtual Smart Card Architecture" -MediaDescription="Virtual PCD Media" -WudfRdDisplayName="UMDF Virtual Smart Card Reader for ScardVisual" -ReaderDeviceName="Virtual PCD" - +; +; VirtualCardReader.inf +; + +[Version] +Signature="$Windows NT$" +Class=SmartCardReader +ClassGuid={50dd5230-ba8a-11d1-bf5d-0000f805f530} +Provider=%MSFTUMDF% +CatalogFile=WUDF.cat +DriverVer=11/22/2010,6.1.7600.16385 + +[Manufacturer] +%MSFTUMDF%=Microsoft,NT$ARCH$ + +[Microsoft.NT$ARCH$] +%ReaderDeviceName%=VReader_Install,root\BixVirtualReader + +; =================== Virtual Reader Device ================================== + +[VReader_Install.NT] +CopyFiles=UMDriverCopy + +[VReader_Install.NT.hw] + +[VReader_Install.NT.Services] +AddService=WUDFRd,0x000001fa,WUDFRD_ServiceInstall + +[VReader_Install.NT.CoInstallers] +AddReg=CoInstallers_AddReg +CopyFiles=CoInstallers_CopyFiles + +[VReader_Install.NT.Wdf] +UmdfService=BixVReader,UMDFVReader_Install +UmdfServiceOrder=BixVReader +UmdfKernelModeClientPolicy=AllowKernelModeClients + +; =================== UMDF Service Install section =================== + +[UMDFVReader_Install] +UmdfLibraryVersion=$UMDFVERSION$ +ServiceBinary=%12%\UMDF\BixVReader.dll +DriverCLSID={d4112073-d09b-458f-a5aa-35ef21eef5de} + +[WUDFRD_ServiceInstall] +DisplayName = %WudfRdDisplayName% +ServiceType = 1 +StartType = 3 +ErrorControl = 1 +ServiceBinary = %12%\WUDFRd.sys +LoadOrderGroup = Base + +[SourceDisksFiles] +BixVReader.dll=1 +WudfUpdate_01009.dll=1 + +[SourceDisksNames] +1 = %MediaDescription% + +[CoInstallers_CopyFiles] +WudfUpdate_$UMDFCOINSTALLERVERSION$.dll + +[CoInstallers_AddReg] +HKR,,CoInstallers32,0x00010000,"WUDFUpdate_$UMDFCOINSTALLERVERSION$.dll" + +[DestinationDirs] +UMDriverCopy=12,UMDF ; copy to driversMdf +CoInstallers_CopyFiles=11 + +[UMDriverCopy] +BixVReader.dll + +; =================== Generic ================================== + +[Strings] +MSFTUMDF="Fabio Ottavi - developer" +MediaDescription="Bix Virtual Card Reader disk 1" +WudfRdDisplayName="Bix UMDF Virtual Smart Card Reader for ScardVisual" +ReaderDeviceName="Bix Virtual Smart Card Reader" + diff --git a/virtualsmartcard/win32/BixVReader/Win7/makefile b/virtualsmartcard/win32/BixVReader/Win7/makefile new file mode 100644 index 0000000..28c5523 --- /dev/null +++ b/virtualsmartcard/win32/BixVReader/Win7/makefile @@ -0,0 +1,7 @@ +# +# Build using BUILD.EXE (Do not edit this section of this file, edit SOURCES) +# +MINIMUM_NT_TARGET_VERSION=0x501 + +!INCLUDE $(NTMAKEENV)\makefile.def + diff --git a/virtualsmartcard/win32/vpcd/makefile.inc b/virtualsmartcard/win32/BixVReader/Win7/makefile.inc similarity index 96% rename from virtualsmartcard/win32/vpcd/makefile.inc rename to virtualsmartcard/win32/BixVReader/Win7/makefile.inc index b08d16e..fa7ef06 100644 --- a/virtualsmartcard/win32/vpcd/makefile.inc +++ b/virtualsmartcard/win32/BixVReader/Win7/makefile.inc @@ -1,8 +1,8 @@ -.SUFFIXES: .inx - -STAMP=stampinf - -.inx{$(OBJ_PATH)\$(O)}.inf: - copy $(@B).inx $@ - $(STAMP) -f $@ -a $(_BUILDARCH) -k $(KMDF_VERSION_MAJOR).$(KMDF_VERSION_MINOR) -u $(UMDF_VERSION_MAJOR).$(UMDF_VERSION_MINOR).0 - +.SUFFIXES: .inx + +STAMP=stampinf + +.inx{$(OBJ_PATH)\$(O)}.inf: + copy $(@B).inx $@ + $(STAMP) -f $@ -a $(_BUILDARCH) -k $(KMDF_VERSION_MAJOR).$(KMDF_VERSION_MINOR) -u $(UMDF_VERSION_MAJOR).$(UMDF_VERSION_MINOR).0 + diff --git a/virtualsmartcard/win32/vpcd/sources b/virtualsmartcard/win32/BixVReader/Win7/sources similarity index 69% rename from virtualsmartcard/win32/vpcd/sources rename to virtualsmartcard/win32/BixVReader/Win7/sources index 6feb501..3a68297 100644 --- a/virtualsmartcard/win32/vpcd/sources +++ b/virtualsmartcard/win32/BixVReader/Win7/sources @@ -1,71 +1,79 @@ -# -# UMDF_VERSION_MAJOR controls the headers that the driver uses. -# UMDF_VERSION_MAJOR + UMDF_VERSION_MINOR control which version -# of UMDF the driver is bound to in the INF and which -# update coinstaller it requires (through stampinf). -# - -UMDF_VERSION_MAJOR=1 -UMDF_VERSION_MINOR=9 - -KMDF_VERSION_MAJOR=1 -KMDF_VERSION_MINOR=9 - - -TARGETNAME=vpcd -TARGETTYPE=DYNLINK - -USE_ATL = 1 -ATL_VER = 71 -USE_MSVCRT = 1 - -C_DEFINES = $(C_DEFINES) /D_UNICODE /DUNICODE - -WIN32_WINNT_VERSION=$(LATEST_WIN32_WINNT_VERSION) -_NT_TARGET_VERSION=$(_NT_TARGET_VERSION_WIN7) -NTDDI_VERSION=$(LATEST_NTDDI_VERSION) - -DLLENTRY=_DllMainCRTStartup -DLLDEF=exports.def - -SOURCES=\ - vpcd.rc \ - driver.cpp \ - device.cpp \ - queue.cpp \ - memory.cpp \ - DllMain.cpp \ - VirtualSCReader.idl - -INCLUDES= $(INCLUDES); \ - $(SDK_INC_PATH); \ - $(DDK_INC_PATH); \ - $(UMDF_INC_PATH)\10; - -MSC_WARNING_LEVEL=/W4 /WX - -TARGETLIBS=\ - $(SDK_LIB_PATH)\strsafe.lib \ - $(SDK_LIB_PATH)\kernel32.lib \ - $(SDK_LIB_PATH)\ole32.lib \ - $(SDK_LIB_PATH)\oleaut32.lib \ - $(SDK_LIB_PATH)\uuid.lib \ - $(SDK_LIB_PATH)\user32.lib \ - $(SDK_LIB_PATH)\advapi32.lib \ - $(SDK_LIB_PATH)\shlwapi.lib \ - $(SDK_LIB_PATH)\ws2_32.lib - -NTTARGETFILE1=$(OBJ_PATH)\$(O)\vpcd.inf - - -# -# This sets up the WPP preprocessor and tells it to scan internal.h to find -# the trace function definition that's in there. -# - -#RUN_WPP= $(SOURCES) -dll -scan:internal.h - - -TARGET_DESTINATION=wudf - - +# +# UMDF_VERSION_MAJOR controls the headers that the driver uses. +# UMDF_VERSION_MAJOR + UMDF_VERSION_MINOR control which version +# of UMDF the driver is bound to in the INF and which +# update coinstaller it requires (through stampinf). +# + +UMDF_VERSION_MAJOR=1 +UMDF_VERSION_MINOR=9 + +KMDF_VERSION_MAJOR=1 +KMDF_VERSION_MINOR=9 + + +TARGETNAME=BixVReader +TARGETTYPE=DYNLINK + +USE_ATL = 1 +USE_STL = 1 +ATL_VER = 71 +USE_MSVCRT = 1 +USE_NATIVE_EH = 1 + +C_DEFINES = $(C_DEFINES) /D_UNICODE /DUNICODE + +WIN32_WINNT_VERSION=$(LATEST_WIN32_WINNT_VERSION) +_NT_TARGET_VERSION=$(_NT_TARGET_VERSION_WIN7) +NTDDI_VERSION=$(LATEST_NTDDI_VERSION) + +DLLENTRY=_DllMainCRTStartup +DLLDEF=..\exports.def + +SOURCES=\ + ..\BixVReader.rc \ + ..\driver.cpp \ + ..\device.cpp \ + ..\reader.cpp \ + ..\pipereader.cpp \ + ..\tcpipreader.cpp \ + ..\..\..\src\vpcd\vpcd.c \ + ..\vpcdreader.cpp \ + ..\queue.cpp \ + ..\memory.cpp \ + ..\sectionLocker.cpp \ + ..\DllMain.cpp \ + ..\VirtualSCReader.idl + +INCLUDES= $(INCLUDES); \ + $(SDK_INC_PATH); \ + $(DDK_INC_PATH); \ + $(UMDF_INC_PATH)\10; + +MSC_WARNING_LEVEL=/W4 /WX + +TARGETLIBS=\ + $(SDK_LIB_PATH)\strsafe.lib \ + $(SDK_LIB_PATH)\kernel32.lib \ + $(SDK_LIB_PATH)\ole32.lib \ + $(SDK_LIB_PATH)\oleaut32.lib \ + $(SDK_LIB_PATH)\uuid.lib \ + $(SDK_LIB_PATH)\user32.lib \ + $(SDK_LIB_PATH)\advapi32.lib \ + $(SDK_LIB_PATH)\shlwapi.lib \ + $(SDK_LIB_PATH)\Ws2_32.lib \ + +NTTARGETFILE1=$(OBJ_PATH)\$(O)\BixVReader.inf + + +# +# This sets up the WPP preprocessor and tells it to scan internal.h to find +# the trace function definition that's in there. +# + +#RUN_WPP= $(SOURCES) -dll -scan:internal.h + + +TARGET_DESTINATION=wudf + + diff --git a/virtualsmartcard/win32/BixVReader/WinXP/BixVReader.inx b/virtualsmartcard/win32/BixVReader/WinXP/BixVReader.inx new file mode 100644 index 0000000..1e16728 --- /dev/null +++ b/virtualsmartcard/win32/BixVReader/WinXP/BixVReader.inx @@ -0,0 +1,80 @@ +; +; VirtualCardReader.inf +; + +[Version] +Signature="$Windows NT$" +Class=SmartCardReader +ClassGuid={50dd5230-ba8a-11d1-bf5d-0000f805f530} +Provider=%MSFTUMDF% +CatalogFile=WUDF.cat +DriverVer=11/22/2010,6.1.7600.16385 + +[Manufacturer] +%MSFTUMDF%=Microsoft,NT$ARCH$ + +[Microsoft.NT$ARCH$] +%ReaderDeviceName%=VReader_Install,root\BixVirtualReader + +; =================== Virtual Reader Device ================================== + +[VReader_Install.NT] +CopyFiles=UMDriverCopy + +[VReader_Install.NT.hw] + +[VReader_Install.NT.Services] +AddService=WUDFRd,0x000001fa,WUDFRD_ServiceInstall + +[VReader_Install.NT.CoInstallers] +AddReg=CoInstallers_AddReg +CopyFiles=CoInstallers_CopyFiles + +[VReader_Install.NT.Wdf] +UmdfService=BixVReader,UMDFVReader_Install +UmdfServiceOrder=BixVReader +UmdfKernelModeClientPolicy=AllowKernelModeClients + +; =================== UMDF Service Install section =================== + +[UMDFVReader_Install] +UmdfLibraryVersion=$UMDFVERSION$ +ServiceBinary=%12%\UMDF\BixVReader.dll +DriverCLSID={d4112073-d09b-458f-a5aa-35ef21eef5de} + +[WUDFRD_ServiceInstall] +DisplayName = %WudfRdDisplayName% +ServiceType = 1 +StartType = 3 +ErrorControl = 1 +ServiceBinary = %12%\WUDFRd.sys +LoadOrderGroup = Base + +[SourceDisksFiles] +BixVReader.dll=1 +WudfUpdate_01009.dll=1 + +[SourceDisksNames] +1 = %MediaDescription% + +[CoInstallers_CopyFiles] +WudfUpdate_$UMDFCOINSTALLERVERSION$.dll + +[CoInstallers_AddReg] +HKR,,CoInstallers32,0x00010000,"WUDFUpdate_$UMDFCOINSTALLERVERSION$.dll" + +[DestinationDirs] +UMDriverCopy=12,UMDF ; copy to driversMdf +CoInstallers_CopyFiles=11 + +[UMDriverCopy] +BixVReader.dll + +; =================== Generic ================================== + +[Strings] +MSFTUMDF="Fabio Ottavi - developer" +MediaDescription="Bix Virtual Card Reader disk 1" +WudfRdDisplayName="Bix UMDF Virtual Smart Card Reader for ScardVisual" +ReaderDeviceName="Bix Virtual Smart Card Reader" + diff --git a/virtualsmartcard/win32/BixVReader/WinXP/makefile b/virtualsmartcard/win32/BixVReader/WinXP/makefile new file mode 100644 index 0000000..28c5523 --- /dev/null +++ b/virtualsmartcard/win32/BixVReader/WinXP/makefile @@ -0,0 +1,7 @@ +# +# Build using BUILD.EXE (Do not edit this section of this file, edit SOURCES) +# +MINIMUM_NT_TARGET_VERSION=0x501 + +!INCLUDE $(NTMAKEENV)\makefile.def + diff --git a/virtualsmartcard/win32/BixVReader/WinXP/makefile.inc b/virtualsmartcard/win32/BixVReader/WinXP/makefile.inc new file mode 100644 index 0000000..fa7ef06 --- /dev/null +++ b/virtualsmartcard/win32/BixVReader/WinXP/makefile.inc @@ -0,0 +1,8 @@ +.SUFFIXES: .inx + +STAMP=stampinf + +.inx{$(OBJ_PATH)\$(O)}.inf: + copy $(@B).inx $@ + $(STAMP) -f $@ -a $(_BUILDARCH) -k $(KMDF_VERSION_MAJOR).$(KMDF_VERSION_MINOR) -u $(UMDF_VERSION_MAJOR).$(UMDF_VERSION_MINOR).0 + diff --git a/virtualsmartcard/win32/BixVReader/WinXP/sources b/virtualsmartcard/win32/BixVReader/WinXP/sources new file mode 100644 index 0000000..e570b00 --- /dev/null +++ b/virtualsmartcard/win32/BixVReader/WinXP/sources @@ -0,0 +1,79 @@ +# +# UMDF_VERSION_MAJOR controls the headers that the driver uses. +# UMDF_VERSION_MAJOR + UMDF_VERSION_MINOR control which version +# of UMDF the driver is bound to in the INF and which +# update coinstaller it requires (through stampinf). +# + +UMDF_VERSION_MAJOR=1 +UMDF_VERSION_MINOR=9 + +KMDF_VERSION_MAJOR=1 +KMDF_VERSION_MINOR=9 + + +TARGETNAME=BixVReader +TARGETTYPE=DYNLINK + +USE_ATL = 1 +USE_STL = 1 +ATL_VER = 71 +USE_MSVCRT = 1 +USE_NATIVE_EH = 1 + +C_DEFINES = $(C_DEFINES) /D_UNICODE /DUNICODE + +WIN32_WINNT_VERSION=$(LATEST_WIN32_WINNT_VERSION) +_NT_TARGET_VERSION=$(_NT_TARGET_VERSION_WINXP) +NTDDI_VERSION=$(LATEST_NTDDI_VERSION) + +DLLENTRY=_DllMainCRTStartup +DLLDEF=..\exports.def + +SOURCES=\ + ..\BixVReader.rc \ + ..\driver.cpp \ + ..\device.cpp \ + ..\reader.cpp \ + ..\pipereader.cpp \ + ..\tcpipreader.cpp \ + ..\..\..\src\vpcd\vpcd.c \ + ..\vpcdreader.cpp \ + ..\queue.cpp \ + ..\memory.cpp \ + ..\sectionLocker.cpp \ + ..\DllMain.cpp \ + ..\VirtualSCReader.idl + +INCLUDES= $(INCLUDES); \ + $(SDK_INC_PATH); \ + $(DDK_INC_PATH); \ + $(UMDF_INC_PATH)\10; + +MSC_WARNING_LEVEL=/W4 /WX + +TARGETLIBS=\ + $(SDK_LIB_PATH)\strsafe.lib \ + $(SDK_LIB_PATH)\kernel32.lib \ + $(SDK_LIB_PATH)\ole32.lib \ + $(SDK_LIB_PATH)\oleaut32.lib \ + $(SDK_LIB_PATH)\uuid.lib \ + $(SDK_LIB_PATH)\user32.lib \ + $(SDK_LIB_PATH)\advapi32.lib \ + $(SDK_LIB_PATH)\shlwapi.lib \ + $(SDK_LIB_PATH)\Ws2_32.lib \ + +NTTARGETFILE1=$(OBJ_PATH)\$(O)\BixVReader.inf + + +# +# This sets up the WPP preprocessor and tells it to scan internal.h to find +# the trace function definition that's in there. +# + +#RUN_WPP= $(SOURCES) -dll -scan:internal.h + + +TARGET_DESTINATION=wudf + + diff --git a/virtualsmartcard/win32/BixVReader/device.cpp b/virtualsmartcard/win32/BixVReader/device.cpp new file mode 100644 index 0000000..a920fec --- /dev/null +++ b/virtualsmartcard/win32/BixVReader/device.cpp @@ -0,0 +1,331 @@ +#include "internal.h" +#include "VirtualSCReader.h" +#include "queue.h" +#include "device.h" +#include "driver.h" +#include +#include +#include "memory.h" +#include "SectionLocker.h" + +HRESULT +CMyDevice::CreateInstance( + __in IWDFDriver *FxDriver, + __in IWDFDeviceInitialize * FxDeviceInit + ) + + /*++ + + Routine Description: + + This method creates and initializs an instance of the virtual smart card reader driver's + device callback object. + + Arguments: + + FxDeviceInit - the settings for the device. + + Device - a location to store the referenced pointer to the device object. + + Return Value: + + Status + + --*/ +{ + inFunc + SectionLogger a(__FUNCTION__); + CComObject* device = NULL; + HRESULT hr; + + OutputDebugString(L"[BixVReader]CreateInstance"); // + // Allocate a new instance of the device class. + // + hr = CComObject::CreateInstance(&device); + + if (device==NULL) + { + return E_OUTOFMEMORY; + } + + // + // Initialize the instance. + // + device->AddRef(); + + OutputDebugString(L"[BixVReader]SetLockingConstraint"); // + FxDeviceInit->SetLockingConstraint(WdfDeviceLevel); + + CComPtr spCallback; + OutputDebugString(L"[BixVReader]QueryInterface"); // + hr = device->QueryInterface(IID_IUnknown, (void**)&spCallback); + + CComPtr spIWDFDevice; + if (SUCCEEDED(hr)) + { + OutputDebugString(L"[BixVReader]CreateDevice"); // + hr = FxDriver->CreateDevice(FxDeviceInit, spCallback, &spIWDFDevice); + } + + device->numInstances=GetPrivateProfileInt(L"Driver",L"NumReaders",1,L"BixVReader.ini"); + + WSADATA wsaData; + int iResult = WSAStartup(MAKEWORD(2, 2), &wsaData); + if (iResult != NO_ERROR) { + OutputDebugString(L"[BixVReader]Error at WSAStartup()\n"); + } + + for (int i=0;inumInstances;i++) { + OutputDebugString(L"[BixVReader]CreateDeviceInterface"); // + wchar_t name[10]; + swprintf(name,L"DEV%i",i); + + if (spIWDFDevice->CreateDeviceInterface(&SmartCardReaderGuid,name)!=0) + OutputDebugString(L"[BixVReader]CreateDeviceInterface Failed"); + } + + SAFE_RELEASE(device); + return hr; +} + +void CMyDevice::ProcessIoControl(__in IWDFIoQueue* pQueue, + __in IWDFIoRequest* pRequest, + __in ULONG ControlCode, + SIZE_T inBufSize, + SIZE_T outBufSize) +{ + inFunc + SectionLogger a(__FUNCTION__); + UNREFERENCED_PARAMETER(pQueue); + wchar_t log[300]; + swprintf(log,L"[BixVReader][IOCT]IOCTL %08X - In %i Out %i",ControlCode,inBufSize,outBufSize); + OutputDebugString(log); + + //SectionLocker lock(m_RequestLock); + int instance=0; + { + CComPtr pFileObject; + pRequest->GetFileObject(&pFileObject); + + if (pFileObject != NULL) + { + DWORD logLen=300; + pFileObject->RetrieveFileName(log,&logLen); + instance=_wtoi(log+(logLen-2)); + } + } + Reader &reader=*readers[instance]; + + if (ControlCode==IOCTL_SMARTCARD_GET_ATTRIBUTE) { + reader.IoSmartCardGetAttribute(pRequest,inBufSize,outBufSize); + return; + } + else if (ControlCode==IOCTL_SMARTCARD_IS_PRESENT) { + reader.IoSmartCardIsPresent(pRequest,inBufSize,outBufSize); + return; + } + else if (ControlCode==IOCTL_SMARTCARD_GET_STATE) { + reader.IoSmartCardGetState(pRequest,inBufSize,outBufSize); + return; + } + else if (ControlCode==IOCTL_SMARTCARD_IS_ABSENT) { + reader.IoSmartCardIsAbsent(pRequest,inBufSize,outBufSize); + return; + } + else if (ControlCode==IOCTL_SMARTCARD_POWER) { + reader.IoSmartCardPower(pRequest,inBufSize,outBufSize); + return; + } + else if (ControlCode==IOCTL_SMARTCARD_SET_ATTRIBUTE) { + reader.IoSmartCardSetAttribute(pRequest,inBufSize,outBufSize); + return; + } + else if (ControlCode==IOCTL_SMARTCARD_SET_PROTOCOL) { + reader.IoSmartCardSetProtocol(pRequest,inBufSize,outBufSize); + return; + } + else if (ControlCode==IOCTL_SMARTCARD_TRANSMIT) { + reader.IoSmartCardTransmit(pRequest,inBufSize,outBufSize); + return; + } + swprintf(log,L"[BixVReader][IOCT]ERROR_NOT_SUPPORTED:%08X",ControlCode); + OutputDebugString(log); + pRequest->CompleteWithInformation(HRESULT_FROM_WIN32(ERROR_NOT_SUPPORTED), 0); + + return; +} + + +DWORD WINAPI ServerFunc(Reader *reader) { + return reader->startServer(); +} + + +///////////////////////////////////////////////////////////////////////// +// +// CMyDevice::OnPrepareHardware +// +// Called by UMDF to prepare the hardware for use. +// +// Parameters: +// pWdfDevice - pointer to an IWDFDevice object representing the +// device +// +// Return Values: +// S_OK: success +// +///////////////////////////////////////////////////////////////////////// + +HRESULT CMyDevice::OnPrepareHardware( + __in IWDFDevice* pWdfDevice + ) +{ + inFunc + SectionLogger a(__FUNCTION__); + // Store the IWDFDevice pointer + m_pWdfDevice = pWdfDevice; + + // Configure the default IO Queue + HRESULT hr = CMyQueue::CreateInstance(m_pWdfDevice, this); + + return hr; +} + + +///////////////////////////////////////////////////////////////////////// +// +// CMyDevice::OnReleaseHardware +// +// Called by WUDF to uninitialize the hardware. +// +// Parameters: +// pWdfDevice - pointer to an IWDFDevice object for the device +// +// Return Values: +// S_OK: +// +///////////////////////////////////////////////////////////////////////// +HRESULT CMyDevice::OnReleaseHardware( + __in IWDFDevice* pWdfDevice + ) +{ + inFunc + SectionLogger a(__FUNCTION__); + UNREFERENCED_PARAMETER(pWdfDevice); + + // Release the IWDFDevice handle, if it matches + if (pWdfDevice == m_pWdfDevice.p) + { + m_pWdfDevice.Release(); + } + + return S_OK; +} + + +HRESULT CMyDevice::OnD0Entry(IN IWDFDevice* pWdfDevice,IN WDF_POWER_DEVICE_STATE previousState) { + SectionLogger a(__FUNCTION__); + UNREFERENCED_PARAMETER(pWdfDevice); + UNREFERENCED_PARAMETER(previousState); + + numInstances=GetPrivateProfileInt(L"Driver",L"NumReaders",1,L"BixVReader.ini"); + readers.resize(numInstances); + + for (int i=0;iinstance=i; + readers[i]->device=this; + GetPrivateProfileStringA(sectionA,"VENDOR_NAME","Bix",readers[i]->vendorName,sizeof readers[i]->vendorName,"BixVReader.ini"); + GetPrivateProfileStringA(sectionA,"VENDOR_IFD_TYPE","VIRTUAL_CARD_READER",readers[i]->vendorIfdType,sizeof readers[i]->vendorIfdType,"BixVReader.ini"); + readers[i]->deviceUnit=GetPrivateProfileInt(section,L"DEVICE_UNIT",i,L"BixVReader.ini"); + readers[i]->protocol=0; + + readers[i]->init(section); + + DWORD pipeThreadID; + readers[i]->serverThread=CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)ServerFunc,readers[i],0,&pipeThreadID); + } + + return S_OK; +} +HRESULT CMyDevice::OnD0Exit(IN IWDFDevice* pWdfDevice,IN WDF_POWER_DEVICE_STATE newState) { + SectionLogger a(__FUNCTION__); + UNREFERENCED_PARAMETER(pWdfDevice); + UNREFERENCED_PARAMETER(newState); + // dovrei fermare tutti i thread in ascolto dei lettori + shutDown(); + return S_OK; +} + +void CMyDevice::shutDown() { + SectionLogger a(__FUNCTION__); + for (int i=0;ishutdown(); + delete readers[i]; + } + numInstances=0; +} +HRESULT CMyDevice::OnQueryRemove(IN IWDFDevice* pWdfDevice) { + SectionLogger a(__FUNCTION__); + UNREFERENCED_PARAMETER(pWdfDevice); + OutputDebugString(L"[BixVReader]OnQueryRemove"); + shutDown(); + return S_OK; +} +HRESULT CMyDevice::OnQueryStop(IN IWDFDevice* pWdfDevice) { + SectionLogger a(__FUNCTION__); + UNREFERENCED_PARAMETER(pWdfDevice); + OutputDebugString(L"[BixVReader]OnQueryStop"); + shutDown(); + return S_OK; +} +void CMyDevice::OnSurpriseRemoval(IN IWDFDevice* pWdfDevice) { + SectionLogger a(__FUNCTION__); + UNREFERENCED_PARAMETER(pWdfDevice); + OutputDebugString(L"[BixVReader]OnSurpriseRemoval"); + shutDown(); +} + +STDMETHODIMP_ (void) CMyDevice::OnCancel(IN IWDFIoRequest* pWdfRequest) { + SectionLogger a(__FUNCTION__); + + wchar_t log[300]; + SectionLocker lock(m_RequestLock); + + int instance=0; + { + CComPtr pFileObject; + pWdfRequest->GetFileObject(&pFileObject); + + if (pFileObject != NULL) + { + DWORD logLen=300; + pFileObject->RetrieveFileName(log,&logLen); + instance=_wtoi(log+(logLen-2)); + } + } + Reader &reader=*readers[instance]; + + if (pWdfRequest==reader.waitRemoveIpr) { + OutputDebugString(L"[BixVReader]Cancel Remove"); + reader.waitRemoveIpr=NULL; + } + else if (pWdfRequest==reader.waitInsertIpr) { + OutputDebugString(L"[BixVReader]Cancel Insert"); + reader.waitInsertIpr=NULL; + } + pWdfRequest->CompleteWithInformation(HRESULT_FROM_WIN32(ERROR_CANCELLED), 0); +} + diff --git a/virtualsmartcard/win32/vpcd/device.h b/virtualsmartcard/win32/BixVReader/device.h similarity index 67% rename from virtualsmartcard/win32/vpcd/device.h rename to virtualsmartcard/win32/BixVReader/device.h index 09565e3..b2657c8 100644 --- a/virtualsmartcard/win32/vpcd/device.h +++ b/virtualsmartcard/win32/BixVReader/device.h @@ -1,112 +1,98 @@ - - -#pragma once - -// -// Class for the iotrace driver. -// - -class ATL_NO_VTABLE CMyDevice : - public CComObjectRootEx, - public IPnpCallbackHardware, - public IPnpCallback, - public IRequestCallbackCancel -{ -public: - ~CMyDevice() {} - - DECLARE_NOT_AGGREGATABLE(CMyDevice) - - BEGIN_COM_MAP(CMyDevice) - COM_INTERFACE_ENTRY(IPnpCallbackHardware) - COM_INTERFACE_ENTRY(IPnpCallback) - COM_INTERFACE_ENTRY(IRequestCallbackCancel) - END_COM_MAP() - - CMyDevice(VOID) - { - m_pWdfDevice = NULL; - waitRemoveIpr=NULL; - waitInsertIpr=NULL; - ctx = NULL; - pipe=NULL; - eventpipe=NULL; - outdata = NULL; - outlength = 0; - indata = NULL; - inlength = 0; - } - - // -// Private data members. -// -private: - - CComPtr m_pWdfDevice; - CComPtr waitRemoveIpr,waitInsertIpr; - struct vicc_ctx *ctx; - BYTE *outdata; - SIZE_T outlength; - BYTE *indata; - SIZE_T inlength; - HANDLE pipe; - HANDLE eventpipe; - -// -// Private methods. -// - -private: - - - HRESULT ConfigureQueue(); - - // -// Public methods -// -public: - - // - // The factory method used to create an instance of this driver. - // - - static - HRESULT CreateInstance( - __in IWDFDriver *FxDriver, - __in IWDFDeviceInitialize *FxDeviceInit - ); - -// -// COM methods -// -public: - - // - // IUnknown methods. - // - - void ProcessIoControl(__in IWDFIoQueue* pQueue, - __in IWDFIoRequest* pRequest, - __in ULONG ControlCode, - SIZE_T InputBufferSizeInBytes, - SIZE_T OutputBufferSizeInBytes); - - STDMETHOD_ (HRESULT, OnPrepareHardware)(__in IWDFDevice* pWdfDevice); - STDMETHOD_ (HRESULT, OnReleaseHardware)(__in IWDFDevice* pWdfDevice); - STDMETHOD_ (HRESULT, OnD0Entry)(IN IWDFDevice* pWdfDevice,IN WDF_POWER_DEVICE_STATE previousState); - STDMETHOD_ (HRESULT, OnD0Exit )(IN IWDFDevice* pWdfDevice,IN WDF_POWER_DEVICE_STATE newState); - STDMETHOD_ (HRESULT, OnQueryRemove )(IN IWDFDevice* pWdfDevice); - STDMETHOD_ (HRESULT, OnQueryStop)(IN IWDFDevice* pWdfDevice); - STDMETHOD_ (void, OnSurpriseRemoval)(IN IWDFDevice* pWdfDevice); - STDMETHOD_ (void, OnCancel)(IN IWDFIoRequest* pWdfRequest); - - void IoSmartCardGetAttribute(IWDFIoRequest* pRequest,SIZE_T inBufSize,SIZE_T outBufSize); - void IoSmartCardIsPresent(IWDFIoRequest* pRequest,SIZE_T inBufSize,SIZE_T outBufSize); - void IoSmartCardGetState(IWDFIoRequest* pRequest,SIZE_T inBufSize,SIZE_T outBufSize); - void IoSmartCardIsAbsent(IWDFIoRequest* pRequest,SIZE_T inBufSize,SIZE_T outBufSize); - void IoSmartCardPower(IWDFIoRequest* pRequest,SIZE_T inBufSize,SIZE_T outBufSize); - void IoSmartCardSetAttribute(IWDFIoRequest* pRequest,SIZE_T inBufSize,SIZE_T outBufSize); - void IoSmartCardTransmit(IWDFIoRequest* pRequest,SIZE_T inBufSize,SIZE_T outBufSize); - void shutDown(); -}; - +#pragma once + +#include +#include "reader.h" + +// +// Class for the iotrace driver. +// +class CMyDevice; + + +class ATL_NO_VTABLE CMyDevice : + public CComObjectRootEx, + public IPnpCallbackHardware, + public IPnpCallback, + public IRequestCallbackCancel +{ +public: + ~CMyDevice() { + DeleteCriticalSection(&m_RequestLock); + } + + DECLARE_NOT_AGGREGATABLE(CMyDevice) + + BEGIN_COM_MAP(CMyDevice) + COM_INTERFACE_ENTRY(IPnpCallbackHardware) + COM_INTERFACE_ENTRY(IPnpCallback) + COM_INTERFACE_ENTRY(IRequestCallbackCancel) + END_COM_MAP() + + CMyDevice(VOID) + { + InitializeCriticalSection(&m_RequestLock); + m_pWdfDevice = NULL; + } + + // +// Private data members. +// +private: + + CComPtr m_pWdfDevice; + std::vector readers; + int numInstances; + +// +// Private methods. +// + +private: + + + HRESULT ConfigureQueue(); + + // +// Public methods +// +public: + + CRITICAL_SECTION m_RequestLock; + + // + // The factory method used to create an instance of this driver. + // + + static + HRESULT CreateInstance( + __in IWDFDriver *FxDriver, + __in IWDFDeviceInitialize *FxDeviceInit + ); + +// +// COM methods +// +public: + + // + // IUnknown methods. + // + + void ProcessIoControl(__in IWDFIoQueue* pQueue, + __in IWDFIoRequest* pRequest, + __in ULONG ControlCode, + SIZE_T InputBufferSizeInBytes, + SIZE_T OutputBufferSizeInBytes); + + STDMETHOD_ (HRESULT, OnPrepareHardware)(__in IWDFDevice* pWdfDevice); + STDMETHOD_ (HRESULT, OnReleaseHardware)(__in IWDFDevice* pWdfDevice); + STDMETHOD_ (HRESULT, OnD0Entry)(IN IWDFDevice* pWdfDevice,IN WDF_POWER_DEVICE_STATE previousState); + STDMETHOD_ (HRESULT, OnD0Exit )(IN IWDFDevice* pWdfDevice,IN WDF_POWER_DEVICE_STATE newState); + STDMETHOD_ (HRESULT, OnQueryRemove )(IN IWDFDevice* pWdfDevice); + STDMETHOD_ (HRESULT, OnQueryStop)(IN IWDFDevice* pWdfDevice); + STDMETHOD_ (void, OnSurpriseRemoval)(IN IWDFDevice* pWdfDevice); + STDMETHOD_ (void, OnCancel)(IN IWDFIoRequest* pWdfRequest); + + void shutDown(); +}; + diff --git a/virtualsmartcard/win32/vpcd/driver.cpp b/virtualsmartcard/win32/BixVReader/driver.cpp similarity index 86% rename from virtualsmartcard/win32/vpcd/driver.cpp rename to virtualsmartcard/win32/BixVReader/driver.cpp index e9ae066..36d9c3a 100644 --- a/virtualsmartcard/win32/vpcd/driver.cpp +++ b/virtualsmartcard/win32/BixVReader/driver.cpp @@ -1,69 +1,75 @@ - -#include "internal.h" -#include "VirtualSCReader.h" -#include "driver.h" -#include "device.h" -#include - -CMyDriver::CMyDriver() -{ -} - -///////////////////////////////////////////////////////////////////////// -// -// CMyDriver::OnDeviceAdd -// -// The framework call this function when device is detected. This driver -// creates a device callback object -// -// Parameters: -// pDriver - pointer to an IWDFDriver object -// pDeviceInit - pointer to a device initialization object -// -// Return Values: -// S_OK: device initialized successfully -// -///////////////////////////////////////////////////////////////////////// -HRESULT CMyDriver::OnDeviceAdd( - __in IWDFDriver* pDriver, - __in IWDFDeviceInitialize* pDeviceInit - ) -{ - inFunc; - HRESULT hr = CMyDevice::CreateInstance(pDriver, pDeviceInit); - - return hr; -} -///////////////////////////////////////////////////////////////////////// -// -// CMyDriver::OnInitialize -// -// The framework calls this function just after loading the driver. The driver -// can perform any global, device independent intialization in this routine. -// -///////////////////////////////////////////////////////////////////////// -HRESULT CMyDriver::OnInitialize( - __in IWDFDriver* pDriver - ) -{ - UNREFERENCED_PARAMETER(pDriver); - return S_OK; -} - -///////////////////////////////////////////////////////////////////////// -// -// CMyDriver::OnDeinitialize -// -// The framework calls this function just before de-initializing itself. All -// WDF framework resources should be released by driver before returning -// from this call. -// -///////////////////////////////////////////////////////////////////////// -void CMyDriver::OnDeinitialize( - __in IWDFDriver* pDriver - ) -{ - UNREFERENCED_PARAMETER(pDriver); - return; -} - +#include "internal.h" +#include "VirtualSCReader.h" +#include "driver.h" +#include "device.h" +#include +#include "SectionLocker.h" + +CMyDriver::CMyDriver() +{ + inFunc +} + +///////////////////////////////////////////////////////////////////////// +// +// CMyDriver::OnDeviceAdd +// +// The framework call this function when device is detected. This driver +// creates a device callback object +// +// Parameters: +// pDriver - pointer to an IWDFDriver object +// pDeviceInit - pointer to a device initialization object +// +// Return Values: +// S_OK: device initialized successfully +// +///////////////////////////////////////////////////////////////////////// +HRESULT CMyDriver::OnDeviceAdd( + __in IWDFDriver* pDriver, + __in IWDFDeviceInitialize* pDeviceInit + ) +{ + inFunc + SectionLogger a(__FUNCTION__); + HRESULT hr = CMyDevice::CreateInstance(pDriver, pDeviceInit); + + return hr; +} +///////////////////////////////////////////////////////////////////////// +// +// CMyDriver::OnInitialize +// +// The framework calls this function just after loading the driver. The driver +// can perform any global, device independent intialization in this routine. +// +///////////////////////////////////////////////////////////////////////// +HRESULT CMyDriver::OnInitialize( + __in IWDFDriver* pDriver + ) +{ + inFunc + SectionLogger a(__FUNCTION__); + UNREFERENCED_PARAMETER(pDriver); + return S_OK; +} + +///////////////////////////////////////////////////////////////////////// +// +// CMyDriver::OnDeinitialize +// +// The framework calls this function just before de-initializing itself. All +// WDF framework resources should be released by driver before returning +// from this call. +// +///////////////////////////////////////////////////////////////////////// +void CMyDriver::OnDeinitialize( + __in IWDFDriver* pDriver + ) +{ + inFunc + SectionLogger a(__FUNCTION__); + UNREFERENCED_PARAMETER(pDriver); + return; +} + diff --git a/virtualsmartcard/win32/vpcd/driver.h b/virtualsmartcard/win32/BixVReader/driver.h similarity index 96% rename from virtualsmartcard/win32/vpcd/driver.h rename to virtualsmartcard/win32/BixVReader/driver.h index a54186a..686d4a8 100644 --- a/virtualsmartcard/win32/vpcd/driver.h +++ b/virtualsmartcard/win32/BixVReader/driver.h @@ -1,37 +1,37 @@ - - -#pragma once - -// -// This class handles driver events for the skeleton sample. In particular -// it supports the OnDeviceAdd event, which occurs when the driver is called -// to setup per-device handlers for a new device stack. -// - -class ATL_NO_VTABLE CMyDriver : - public CComObjectRootEx, - public CComCoClass, - public IDriverEntry -{ -public: - CMyDriver(); - - DECLARE_NO_REGISTRY() - DECLARE_CLASSFACTORY() - DECLARE_NOT_AGGREGATABLE(CMyDriver) - - BEGIN_COM_MAP(CMyDriver) - COM_INTERFACE_ENTRY(IDriverEntry) - END_COM_MAP() - -public: - // - // IDriverEntry - // - STDMETHOD (OnInitialize)(__in IWDFDriver* pDriver); - STDMETHOD (OnDeviceAdd)(__in IWDFDriver* pDriver, __in IWDFDeviceInitialize* pDeviceInit); - STDMETHOD_ (void, OnDeinitialize)(__in IWDFDriver* pDriver); -}; - -OBJECT_ENTRY_AUTO(__uuidof(VirtualSCReaderDriver), CMyDriver) - + + +#pragma once + +// +// This class handles driver events for the skeleton sample. In particular +// it supports the OnDeviceAdd event, which occurs when the driver is called +// to setup per-device handlers for a new device stack. +// + +class ATL_NO_VTABLE CMyDriver : + public CComObjectRootEx, + public CComCoClass, + public IDriverEntry +{ +public: + CMyDriver(); + + DECLARE_NO_REGISTRY() + DECLARE_CLASSFACTORY() + DECLARE_NOT_AGGREGATABLE(CMyDriver) + + BEGIN_COM_MAP(CMyDriver) + COM_INTERFACE_ENTRY(IDriverEntry) + END_COM_MAP() + +public: + // + // IDriverEntry + // + STDMETHOD (OnInitialize)(__in IWDFDriver* pDriver); + STDMETHOD (OnDeviceAdd)(__in IWDFDriver* pDriver, __in IWDFDeviceInitialize* pDeviceInit); + STDMETHOD_ (void, OnDeinitialize)(__in IWDFDriver* pDriver); +}; + +OBJECT_ENTRY_AUTO(__uuidof(VirtualSCReaderDriver), CMyDriver) + diff --git a/virtualsmartcard/win32/vpcd/exports.def b/virtualsmartcard/win32/BixVReader/exports.def similarity index 95% rename from virtualsmartcard/win32/vpcd/exports.def rename to virtualsmartcard/win32/BixVReader/exports.def index c5bf3b4..99f9490 100644 --- a/virtualsmartcard/win32/vpcd/exports.def +++ b/virtualsmartcard/win32/BixVReader/exports.def @@ -1,15 +1,15 @@ -; Skeleton.def : Declares the module parameters. - -; -; TODO: Change the library name here to match your binary name. -; - -LIBRARY "UMDFSkeleton.DLL" - -EXPORTS - DllCanUnloadNow PRIVATE - DllGetClassObject PRIVATE - DllRegisterServer PRIVATE - DllUnregisterServer PRIVATE - - +; Skeleton.def : Declares the module parameters. + +; +; TODO: Change the library name here to match your binary name. +; + +LIBRARY "UMDFSkeleton.DLL" + +EXPORTS + DllCanUnloadNow PRIVATE + DllGetClassObject PRIVATE + DllRegisterServer PRIVATE + DllUnregisterServer PRIVATE + + diff --git a/virtualsmartcard/win32/vpcd/internal.h b/virtualsmartcard/win32/BixVReader/internal.h similarity index 79% rename from virtualsmartcard/win32/vpcd/internal.h rename to virtualsmartcard/win32/BixVReader/internal.h index 7a1f9d0..7613d56 100644 --- a/virtualsmartcard/win32/vpcd/internal.h +++ b/virtualsmartcard/win32/BixVReader/internal.h @@ -1,74 +1,75 @@ - -#pragma once - -#include -#include -#include -#include - -__user_driver; // Macro letting the compiler know this is not a kernel driver (this will help surpress needless warnings) - -// Common WPD and WUDF headers - -#ifndef ARRAY_SIZE -#define ARRAY_SIZE(x) (sizeof(x) / sizeof(x[0])) -#endif - -#ifndef SAFE_RELEASE -#define SAFE_RELEASE(p) {if ((p)) { (p)->Release(); (p) = NULL; }} -#endif - -#define STATUS_SUCCESS ((NTSTATUS)0x00000000L) // ntsubauth -#define STATUS_NO_MEDIA ((NTSTATUS)0xC0000178L) -#define STATUS_INVALID_DEVICE_STATE ((NTSTATUS)0xC0000184L) - - -// -// Include the WUDF DDI -// -#include -#include -#include -#include -#include "PortableDeviceTypes.h" -#include "PortableDeviceClassExtension.h" -#include "PortableDevice.h" - -#include "wudfddi.h" - -// -// Use specstrings for in/out annotation of function parameters. -// - -#include "specstrings.h" - -// -// Forward definitions of classes in the other header files. -// - -typedef class CMyDriver *PCMyDriver; -typedef class CMyDevice *PCMyDevice; - -// -DEFINE_GUID(SmartCardReaderGuid, 0x50DD5230, 0xBA8A, 0x11D1, 0xBF,0x5D,0x00,0x00,0xF8,0x05,0xF5,0x30); -// -// Include the type specific headers. -// - -class funcTrace { -public: - wchar_t funcN[500]; - funcTrace (char *func) { - wchar_t funcName[500]; - wsprintf(funcN,L"%S",func); - wsprintf(funcName,L"IN -> %s\n",funcN); - OutputDebugString(funcName); - } - ~funcTrace () { - wchar_t funcName[500]; - wsprintf(funcName,L"OUT -> %s\n",funcN); - OutputDebugString(funcName); - } -}; - -#define inFunc funcTrace _ftrace(__FUNCTION__); + +#pragma once + +#include +#include +#include +#include + +//__user_driver; // Macro letting the compiler know this is not a kernel driver (this will help surpress needless warnings) + +// Common WPD and WUDF headers + +#ifndef ARRAY_SIZE +#define ARRAY_SIZE(x) (sizeof(x) / sizeof(x[0])) +#endif + +#ifndef SAFE_RELEASE +#define SAFE_RELEASE(p) {if ((p)) { (p)->Release(); (p) = NULL; }} +#endif + +#define STATUS_SUCCESS ((NTSTATUS)0x00000000L) // ntsubauth +#define STATUS_NO_MEDIA ((NTSTATUS)0xC0000178L) +#define STATUS_INVALID_DEVICE_STATE ((NTSTATUS)0xC0000184L) + + +// +// Include the WUDF DDI +// +#include +#include +#include +#include +#include "PortableDeviceTypes.h" +#include "PortableDeviceClassExtension.h" +#include "PortableDevice.h" + +#include "wudfddi.h" + +// +// Use specstrings for in/out annotation of function parameters. +// + +#include "specstrings.h" + +// +// Forward definitions of classes in the other header files. +// + +typedef class CMyDriver *PCMyDriver; +typedef class CMyDevice *PCMyDevice; + +// +DEFINE_GUID(SmartCardReaderGuid, 0x50DD5230, 0xBA8A, 0x11D1, 0xBF,0x5D,0x00,0x00,0xF8,0x05,0xF5,0x30); +// +// Include the type specific headers. +// + +class funcTrace { +public: + wchar_t funcN[500]; + funcTrace (char *func) { + wchar_t funcName[500]; + wsprintf(funcN,L"%S",func); + wsprintf(funcName,L"[BixVReader]IN -> %s",funcN); + OutputDebugString(funcName); + } + ~funcTrace () { + wchar_t funcName[500]; + wsprintf(funcName,L"[BixVReader]OUT -> %s",funcN); + OutputDebugString(funcName); + } +}; + +//#define inFunc funcTrace _ftrace(__FUNCTION__); +#define inFunc \ No newline at end of file diff --git a/virtualsmartcard/win32/vpcd/memory.cpp b/virtualsmartcard/win32/BixVReader/memory.cpp similarity index 61% rename from virtualsmartcard/win32/vpcd/memory.cpp rename to virtualsmartcard/win32/BixVReader/memory.cpp index c19da36..321ad74 100644 --- a/virtualsmartcard/win32/vpcd/memory.cpp +++ b/virtualsmartcard/win32/BixVReader/memory.cpp @@ -1,103 +1,83 @@ -#include "memory.h" - -bool getBuffer(IWDFIoRequest *pRequest, BYTE **buffer, SIZE_T *bufferLen) -{ - IWDFMemory *inmem=NULL; - - if (!pRequest || !buffer || !bufferLen) { - OutputDebugString(L"wrong arguments"); - return false; - } - - pRequest->GetInputMemory(&inmem); - if (inmem==NULL) { - OutputDebugString(L"GetInputMemory failed"); - return false; - } else { - SIZE_T size; - void *data=inmem->GetDataBuffer(&size); - if (*bufferLen < size) { - BYTE *p = (BYTE *) realloc(*buffer, size); - if (!p) { - OutputDebugString(L"realloc failed"); - inmem->Release(); - return false; - } - *buffer = p; - } - - memcpy(*buffer, data, size); - (*bufferLen) = size; - - inmem->Release(); - return true; - } -} - -void completeWithBuffer(IWDFIoRequest* pRequest,BYTE *result,int inSize) { - IWDFMemory *outmem=NULL; - pRequest->GetOutputMemory (&outmem); - if (outmem==NULL) { - OutputDebugString(L"GetOutputMemory failed"); - pRequest->Complete(HRESULT_FROM_WIN32(ERROR_GEN_FAILURE)); - } - else { - outmem->CopyFromBuffer(0,result,inSize); - outmem->Release(); - pRequest->CompleteWithInformation(0,(SIZE_T)inSize); - } -} - -void completeWithString(IWDFIoRequest* pRequest,char *result,int outSize) { - IWDFMemory *outmem=NULL; - pRequest->GetOutputMemory (&outmem); - if (outmem==NULL) { - OutputDebugString(L"GetOutputMemory failed"); - pRequest->Complete(HRESULT_FROM_WIN32(ERROR_GEN_FAILURE)); - } - else { - int size=min(outSize,(int)strlen(result)+1); - outmem->CopyFromBuffer(0,result,size); - outmem->Release(); - pRequest->CompleteWithInformation(0,(SIZE_T)size); - } -} -void completeWithInteger(IWDFIoRequest* pRequest,DWORD result) { - IWDFMemory *outmem=NULL; - pRequest->GetOutputMemory (&outmem); - if (outmem==NULL) { - OutputDebugString(L"GetOutputMemory failed"); - pRequest->Complete(HRESULT_FROM_WIN32(ERROR_GEN_FAILURE)); - } - else { - outmem->CopyFromBuffer(0,&result,sizeof(result)); - outmem->Release(); - pRequest->CompleteWithInformation(0,sizeof(result)); - } -} - -bool getInteger(IWDFIoRequest *pRequest, DWORD *integer) -{ - IWDFMemory *inmem=NULL; - - if (!pRequest || !integer) { - OutputDebugString(L"wrong arguments"); - return false; - } - - pRequest->GetInputMemory(&inmem); - if (inmem==NULL) { - OutputDebugString(L"GetInputMemory failed"); - return false; - } else { - SIZE_T size; - void *data=inmem->GetDataBuffer(&size); - if (size != sizeof(*integer)) { - OutputDebugString(L"not enough memory failed"); - return false; - } - *integer=*(DWORD *)data; - inmem->Release(); - return true; - } -} +#include "memory.h" +#include "SectionLocker.h" + +bool getBuffer(IWDFIoRequest* pRequest,BYTE *buffer,int *bufferLen) { + + IWDFMemory *inmem=NULL; + pRequest->GetInputMemory(&inmem); + if (inmem==NULL) { + OutputDebugString(L"GetInputMemory failed"); + return false; + } + else { + SIZE_T size; + void *data=inmem->GetDataBuffer(&size); + memcpy(buffer,data,size); + (*bufferLen)=(int)size; + inmem->Release(); + return true; + } +} +void setBuffer(CMyDevice *device,IWDFIoRequest* pRequest,BYTE *result,int inSize) { + IWDFMemory *outmem=NULL; + pRequest->GetOutputMemory (&outmem); + if (outmem==NULL) { + SectionLocker lock(device->m_RequestLock); + OutputDebugString(L"GetOutputMemory failed"); + pRequest->Complete(HRESULT_FROM_WIN32(ERROR_GEN_FAILURE)); + } + else { + SectionLocker lock(device->m_RequestLock); + outmem->CopyFromBuffer(0,result,inSize); + outmem->Release(); + pRequest->CompleteWithInformation(0,(SIZE_T)inSize); + } +} + +void setString(CMyDevice *device,IWDFIoRequest* pRequest,char *result,int outSize) { + IWDFMemory *outmem=NULL; + pRequest->GetOutputMemory (&outmem); + if (outmem==NULL) { + SectionLocker lock(device->m_RequestLock); + OutputDebugString(L"GetOutputMemory failed"); + pRequest->Complete(HRESULT_FROM_WIN32(ERROR_GEN_FAILURE)); + } + else { + SectionLocker lock(device->m_RequestLock); + int size=min(outSize,(int)strlen(result)+1); + outmem->CopyFromBuffer(0,result,size); + outmem->Release(); + pRequest->CompleteWithInformation(0,(SIZE_T)size); + } +} +void setInt(CMyDevice *device,IWDFIoRequest* pRequest,DWORD result) { + IWDFMemory *outmem=NULL; + pRequest->GetOutputMemory (&outmem); + if (outmem==NULL) { + SectionLocker lock(device->m_RequestLock); + OutputDebugString(L"GetOutputMemory failed"); + pRequest->Complete(HRESULT_FROM_WIN32(ERROR_GEN_FAILURE)); + } + else { + SectionLocker lock(device->m_RequestLock); + outmem->CopyFromBuffer(0,&result,sizeof(result)); + outmem->Release(); + pRequest->CompleteWithInformation(0,sizeof(result)); + } +} +DWORD getInt(IWDFIoRequest* pRequest) { + + IWDFMemory *inmem=NULL; + pRequest->GetInputMemory(&inmem); + if (inmem==NULL) { + OutputDebugString(L"GetInputMemory failed"); + return 0xffffffff; + } + else { + SIZE_T size; + void *data=inmem->GetDataBuffer(&size); + DWORD d=*(DWORD *)data; + inmem->Release(); + return d; + } +} diff --git a/virtualsmartcard/win32/BixVReader/memory.h b/virtualsmartcard/win32/BixVReader/memory.h new file mode 100644 index 0000000..4dab642 --- /dev/null +++ b/virtualsmartcard/win32/BixVReader/memory.h @@ -0,0 +1,10 @@ +#pragma once +#include "internal.h" +#include "device.h" + + +bool getBuffer(IWDFIoRequest* pRequest,BYTE *buffer,int *bufferLen); +void setString(CMyDevice *device,IWDFIoRequest* pRequest,char *result,int outSize); +void setBuffer(CMyDevice *device,IWDFIoRequest* pRequest,BYTE *result,int inSize); +void setInt(CMyDevice *device,IWDFIoRequest* pRequest,DWORD result); +DWORD getInt(IWDFIoRequest* pRequest); diff --git a/virtualsmartcard/win32/vpcd/resource.h b/virtualsmartcard/win32/BixVReader/resource.h similarity index 97% rename from virtualsmartcard/win32/vpcd/resource.h rename to virtualsmartcard/win32/BixVReader/resource.h index 9b98459..6f6d713 100644 --- a/virtualsmartcard/win32/vpcd/resource.h +++ b/virtualsmartcard/win32/BixVReader/resource.h @@ -1,1496 +1,1496 @@ -//{{NO_DEPENDENCIES}} -// Microsoft Visual C++ generated include file. -// Used by Skeleton.rc -// -#define SW_HIDE 0 -#define HIDE_WINDOW 0 -#define WM_NULL 0x0000 -#define WA_INACTIVE 0 -#define HTNOWHERE 0 -#define SMTO_NORMAL 0x0000 -#define ICON_SMALL 0 -#define SIZE_RESTORED 0 -#define BN_CLICKED 0 -#define BST_UNCHECKED 0x0000 -#define HDS_HORZ 0x0000 -#define TBSTYLE_BUTTON 0x0000 -#define TBS_HORZ 0x0000 -#define TBS_BOTTOM 0x0000 -#define TBS_RIGHT 0x0000 -#define LVS_ICON 0x0000 -#define LVS_ALIGNTOP 0x0000 -#define TCS_TABS 0x0000 -#define TCS_SINGLELINE 0x0000 -#define TCS_RIGHTJUSTIFY 0x0000 -#define DTS_SHORTDATEFORMAT 0x0000 -#define PGS_VERT 0x00000000 -#define LANG_NEUTRAL 0x00 -#define SUBLANG_NEUTRAL 0x00 -#define SORT_DEFAULT 0x0 -#define SORT_JAPANESE_XJIS 0x0 -#define SORT_CHINESE_BIG5 0x0 -#define SORT_CHINESE_PRCP 0x0 -#define SORT_KOREAN_KSC 0x0 -#define SORT_HUNGARIAN_DEFAULT 0x0 -#define SORT_GEORGIAN_TRADITIONAL 0x0 -#define _USE_DECLSPECS_FOR_SAL 0 -#define _USE_ATTRIBUTES_FOR_SAL 0 -#define VER_PRODUCTMINORVERSION 0 -#define VER_DEBUG 0 -#define VER_PRERELEASE 0 -#define CREATEPROCESS_MANIFEST_RESOURCE_ID 1 -#define MINIMUM_RESERVED_MANIFEST_RESOURCE_ID 1 -#define SW_SHOWNORMAL 1 -#define SW_NORMAL 1 -#define SHOW_OPENWINDOW 1 -#define SW_PARENTCLOSING 1 -#define VK_LBUTTON 0x01 -#define WM_CREATE 0x0001 -#define WA_ACTIVE 1 -#define PWR_OK 1 -#define PWR_SUSPENDREQUEST 1 -#define NFR_ANSI 1 -#define UIS_SET 1 -#define UISF_HIDEFOCUS 0x1 -#define XBUTTON1 0x0001 -#define WMSZ_LEFT 1 -#define HTCLIENT 1 -#define SMTO_BLOCK 0x0001 -#define MA_ACTIVATE 1 -#define ICON_BIG 1 -#define SIZE_MINIMIZED 1 -#define MK_LBUTTON 0x0001 -#define TME_HOVER 0x00000001 -#define CS_VREDRAW 0x0001 -#define CF_TEXT 1 -#define SCF_ISSECURE 0x00000001 -#define IDOK 1 -#define BN_PAINT 1 -#define BST_CHECKED 0x0001 -#define TBSTYLE_SEP 0x0001 -#define TTS_ALWAYSTIP 0x01 -#define TBS_AUTOTICKS 0x0001 -#define UDS_WRAP 0x0001 -#define PBS_SMOOTH 0x01 -#define LWS_TRANSPARENT 0x0001 -#define LVS_REPORT 0x0001 -#define TVS_HASBUTTONS 0x0001 -#define TCS_SCROLLOPPOSITE 0x0001 -#define ACS_CENTER 0x0001 -#define MCS_DAYSTATE 0x0001 -#define DTS_UPDOWN 0x0001 -#define PGS_HORZ 0x00000001 -#define NFS_EDIT 0x0001 -#define BCSIF_GLYPH 0x0001 -#define BCSS_NOSPLIT 0x0001 -#define LANG_ARABIC 0x01 -#define SUBLANG_DEFAULT 0x01 -#define SUBLANG_AFRIKAANS_SOUTH_AFRICA 0x01 -#define SUBLANG_ALBANIAN_ALBANIA 0x01 -#define SUBLANG_ALSATIAN_FRANCE 0x01 -#define SUBLANG_AMHARIC_ETHIOPIA 0x01 -#define SUBLANG_ARABIC_SAUDI_ARABIA 0x01 -#define SUBLANG_ARMENIAN_ARMENIA 0x01 -#define SUBLANG_ASSAMESE_INDIA 0x01 -#define SUBLANG_AZERI_LATIN 0x01 -#define SUBLANG_BASHKIR_RUSSIA 0x01 -#define SUBLANG_BASQUE_BASQUE 0x01 -#define SUBLANG_BELARUSIAN_BELARUS 0x01 -#define SUBLANG_BENGALI_INDIA 0x01 -#define SUBLANG_BRETON_FRANCE 0x01 -#define SUBLANG_BULGARIAN_BULGARIA 0x01 -#define SUBLANG_CATALAN_CATALAN 0x01 -#define SUBLANG_CHINESE_TRADITIONAL 0x01 -#define SUBLANG_CORSICAN_FRANCE 0x01 -#define SUBLANG_CZECH_CZECH_REPUBLIC 0x01 -#define SUBLANG_CROATIAN_CROATIA 0x01 -#define SUBLANG_DANISH_DENMARK 0x01 -#define SUBLANG_DARI_AFGHANISTAN 0x01 -#define SUBLANG_DIVEHI_MALDIVES 0x01 -#define SUBLANG_DUTCH 0x01 -#define SUBLANG_ENGLISH_US 0x01 -#define SUBLANG_ESTONIAN_ESTONIA 0x01 -#define SUBLANG_FAEROESE_FAROE_ISLANDS 0x01 -#define SUBLANG_FILIPINO_PHILIPPINES 0x01 -#define SUBLANG_FINNISH_FINLAND 0x01 -#define SUBLANG_FRENCH 0x01 -#define SUBLANG_FRISIAN_NETHERLANDS 0x01 -#define SUBLANG_GALICIAN_GALICIAN 0x01 -#define SUBLANG_GEORGIAN_GEORGIA 0x01 -#define SUBLANG_GERMAN 0x01 -#define SUBLANG_GREEK_GREECE 0x01 -#define SUBLANG_GREENLANDIC_GREENLAND 0x01 -#define SUBLANG_GUJARATI_INDIA 0x01 -#define SUBLANG_HAUSA_NIGERIA_LATIN 0x01 -#define SUBLANG_HEBREW_ISRAEL 0x01 -#define SUBLANG_HINDI_INDIA 0x01 -#define SUBLANG_HUNGARIAN_HUNGARY 0x01 -#define SUBLANG_ICELANDIC_ICELAND 0x01 -#define SUBLANG_IGBO_NIGERIA 0x01 -#define SUBLANG_INDONESIAN_INDONESIA 0x01 -#define SUBLANG_INUKTITUT_CANADA 0x01 -#define SUBLANG_ITALIAN 0x01 -#define SUBLANG_JAPANESE_JAPAN 0x01 -#define SUBLANG_KANNADA_INDIA 0x01 -#define SUBLANG_KAZAK_KAZAKHSTAN 0x01 -#define SUBLANG_KHMER_CAMBODIA 0x01 -#define SUBLANG_KICHE_GUATEMALA 0x01 -#define SUBLANG_KINYARWANDA_RWANDA 0x01 -#define SUBLANG_KONKANI_INDIA 0x01 -#define SUBLANG_KOREAN 0x01 -#define SUBLANG_KYRGYZ_KYRGYZSTAN 0x01 -#define SUBLANG_LAO_LAO 0x01 -#define SUBLANG_LATVIAN_LATVIA 0x01 -#define SUBLANG_LITHUANIAN 0x01 -#define SUBLANG_LUXEMBOURGISH_LUXEMBOURG 0x01 -#define SUBLANG_MACEDONIAN_MACEDONIA 0x01 -#define SUBLANG_MALAY_MALAYSIA 0x01 -#define SUBLANG_MALAYALAM_INDIA 0x01 -#define SUBLANG_MALTESE_MALTA 0x01 -#define SUBLANG_MAORI_NEW_ZEALAND 0x01 -#define SUBLANG_MAPUDUNGUN_CHILE 0x01 -#define SUBLANG_MARATHI_INDIA 0x01 -#define SUBLANG_MOHAWK_MOHAWK 0x01 -#define SUBLANG_MONGOLIAN_CYRILLIC_MONGOLIA 0x01 -#define SUBLANG_NEPALI_NEPAL 0x01 -#define SUBLANG_NORWEGIAN_BOKMAL 0x01 -#define SUBLANG_OCCITAN_FRANCE 0x01 -#define SUBLANG_ORIYA_INDIA 0x01 -#define SUBLANG_PASHTO_AFGHANISTAN 0x01 -#define SUBLANG_PERSIAN_IRAN 0x01 -#define SUBLANG_POLISH_POLAND 0x01 -#define SUBLANG_PORTUGUESE_BRAZILIAN 0x01 -#define SUBLANG_PUNJABI_INDIA 0x01 -#define SUBLANG_QUECHUA_BOLIVIA 0x01 -#define SUBLANG_ROMANIAN_ROMANIA 0x01 -#define SUBLANG_ROMANSH_SWITZERLAND 0x01 -#define SUBLANG_RUSSIAN_RUSSIA 0x01 -#define SUBLANG_SAMI_NORTHERN_NORWAY 0x01 -#define SUBLANG_SANSKRIT_INDIA 0x01 -#define SUBLANG_SERBIAN_CROATIA 0x01 -#define SUBLANG_SINDHI_INDIA 0x01 -#define SUBLANG_SINHALESE_SRI_LANKA 0x01 -#define SUBLANG_SOTHO_NORTHERN_SOUTH_AFRICA 0x01 -#define SUBLANG_SLOVAK_SLOVAKIA 0x01 -#define SUBLANG_SLOVENIAN_SLOVENIA 0x01 -#define SUBLANG_SPANISH 0x01 -#define SUBLANG_SWAHILI_KENYA 0x01 -#define SUBLANG_SWEDISH 0x01 -#define SUBLANG_SYRIAC_SYRIA 0x01 -#define SUBLANG_TAJIK_TAJIKISTAN 0x01 -#define SUBLANG_TAMIL_INDIA 0x01 -#define SUBLANG_TATAR_RUSSIA 0x01 -#define SUBLANG_TELUGU_INDIA 0x01 -#define SUBLANG_THAI_THAILAND 0x01 -#define SUBLANG_TIBETAN_PRC 0x01 -#define SUBLANG_TSWANA_SOUTH_AFRICA 0x01 -#define SUBLANG_TURKISH_TURKEY 0x01 -#define SUBLANG_TURKMEN_TURKMENISTAN 0x01 -#define SUBLANG_UIGHUR_PRC 0x01 -#define SUBLANG_UKRAINIAN_UKRAINE 0x01 -#define SUBLANG_UPPER_SORBIAN_GERMANY 0x01 -#define SUBLANG_URDU_PAKISTAN 0x01 -#define SUBLANG_UZBEK_LATIN 0x01 -#define SUBLANG_VIETNAMESE_VIETNAM 0x01 -#define SUBLANG_WELSH_UNITED_KINGDOM 0x01 -#define SUBLANG_WOLOF_SENEGAL 0x01 -#define SUBLANG_XHOSA_SOUTH_AFRICA 0x01 -#define SUBLANG_YAKUT_RUSSIA 0x01 -#define SUBLANG_YI_PRC 0x01 -#define SUBLANG_YORUBA_NIGERIA 0x01 -#define SUBLANG_ZULU_SOUTH_AFRICA 0x01 -#define SORT_INVARIANT_MATH 0x1 -#define SORT_JAPANESE_UNICODE 0x1 -#define SORT_CHINESE_UNICODE 0x1 -#define SORT_KOREAN_UNICODE 0x1 -#define SORT_GERMAN_PHONE_BOOK 0x1 -#define SORT_HUNGARIAN_TECHNICAL 0x1 -#define SORT_GEORGIAN_MODERN 0x1 -#define VS_VERSION_INFO 1 -#define VFFF_ISSHAREDFILE 0x0001 -#define VFF_CURNEDEST 0x0001 -#define VIFF_FORCEINSTALL 0x0001 -#define ISOLATIONAWARE_MANIFEST_RESOURCE_ID 2 -#define SW_SHOWMINIMIZED 2 -#define SHOW_ICONWINDOW 2 -#define SW_OTHERZOOM 2 -#define VK_RBUTTON 0x02 -#define WM_DESTROY 0x0002 -#define WA_CLICKACTIVE 2 -#define PWR_SUSPENDRESUME 2 -#define NFR_UNICODE 2 -#define UIS_CLEAR 2 -#define UISF_HIDEACCEL 0x2 -#define XBUTTON2 0x0002 -#define WMSZ_RIGHT 2 -#define HTCAPTION 2 -#define SMTO_ABORTIFHUNG 0x0002 -#define MA_ACTIVATEANDEAT 2 -#define ICON_SMALL2 2 -#define SIZE_MAXIMIZED 2 -#define MK_RBUTTON 0x0002 -#define TME_LEAVE 0x00000002 -#define CS_HREDRAW 0x0002 -#define CF_BITMAP 2 -#define IDCANCEL 2 -#define BN_HILITE 2 -#define BST_INDETERMINATE 0x0002 -#define HDS_BUTTONS 0x0002 -#define TBSTYLE_CHECK 0x0002 -#define TTS_NOPREFIX 0x02 -#define TBS_VERT 0x0002 -#define UDS_SETBUDDYINT 0x0002 -#define LWS_IGNORERETURN 0x0002 -#define LVS_SMALLICON 0x0002 -#define TVS_HASLINES 0x0002 -#define TVS_EX_MULTISELECT 0x0002 -#define TCS_BOTTOM 0x0002 -#define TCS_RIGHT 0x0002 -#define ACS_TRANSPARENT 0x0002 -#define MCS_MULTISELECT 0x0002 -#define DTS_SHOWNONE 0x0002 -#define PGS_AUTOSCROLL 0x00000002 -#define NFS_STATIC 0x0002 -#define BCSIF_IMAGE 0x0002 -#define BCSS_STRETCH 0x0002 -#define LANG_BULGARIAN 0x02 -#define SUBLANG_SYS_DEFAULT 0x02 -#define SUBLANG_ARABIC_IRAQ 0x02 -#define SUBLANG_AZERI_CYRILLIC 0x02 -#define SUBLANG_BENGALI_BANGLADESH 0x02 -#define SUBLANG_CHINESE_SIMPLIFIED 0x02 -#define SUBLANG_DUTCH_BELGIAN 0x02 -#define SUBLANG_ENGLISH_UK 0x02 -#define SUBLANG_FRENCH_BELGIAN 0x02 -#define SUBLANG_GERMAN_SWISS 0x02 -#define SUBLANG_INUKTITUT_CANADA_LATIN 0x02 -#define SUBLANG_IRISH_IRELAND 0x02 -#define SUBLANG_ITALIAN_SWISS 0x02 -#define SUBLANG_KASHMIRI_SASIA 0x02 -#define SUBLANG_KASHMIRI_INDIA 0x02 -#define SUBLANG_LOWER_SORBIAN_GERMANY 0x02 -#define SUBLANG_MALAY_BRUNEI_DARUSSALAM 0x02 -#define SUBLANG_MONGOLIAN_PRC 0x02 -#define SUBLANG_NEPALI_INDIA 0x02 -#define SUBLANG_NORWEGIAN_NYNORSK 0x02 -#define SUBLANG_PORTUGUESE 0x02 -#define SUBLANG_QUECHUA_ECUADOR 0x02 -#define SUBLANG_SAMI_NORTHERN_SWEDEN 0x02 -#define SUBLANG_SERBIAN_LATIN 0x02 -#define SUBLANG_SINDHI_PAKISTAN 0x02 -#define SUBLANG_SINDHI_AFGHANISTAN 0x02 -#define SUBLANG_SPANISH_MEXICAN 0x02 -#define SUBLANG_SWEDISH_FINLAND 0x02 -#define SUBLANG_TAMAZIGHT_ALGERIA_LATIN 0x02 -#define SUBLANG_TIGRIGNA_ERITREA 0x02 -#define SUBLANG_URDU_INDIA 0x02 -#define SUBLANG_UZBEK_CYRILLIC 0x02 -#define SORT_CHINESE_PRC 0x2 -#define VFF_FILEINUSE 0x0002 -#define VIFF_DONTDELETEOLD 0x0002 -#define ISOLATIONAWARE_NOSTATICIMPORT_MANIFEST_RESOURCE_ID 3 -#define SW_SHOWMAXIMIZED 3 -#define SW_MAXIMIZE 3 -#define SHOW_FULLSCREEN 3 -#define SW_PARENTOPENING 3 -#define VK_CANCEL 0x03 -#define WM_MOVE 0x0003 -#define PWR_CRITICALRESUME 3 -#define NF_QUERY 3 -#define UIS_INITIALIZE 3 -#define WMSZ_TOP 3 -#define HTSYSMENU 3 -#define MA_NOACTIVATE 3 -#define SIZE_MAXSHOW 3 -#define CF_METAFILEPICT 3 -#define IDABORT 3 -#define BN_UNHILITE 3 -#define LVS_LIST 0x0003 -#define LVS_TYPEMASK 0x0003 -#define LANG_CATALAN 0x03 -#define SUBLANG_CUSTOM_DEFAULT 0x03 -#define SUBLANG_ARABIC_EGYPT 0x03 -#define SUBLANG_CHINESE_HONGKONG 0x03 -#define SUBLANG_ENGLISH_AUS 0x03 -#define SUBLANG_FRENCH_CANADIAN 0x03 -#define SUBLANG_GERMAN_AUSTRIAN 0x03 -#define SUBLANG_QUECHUA_PERU 0x03 -#define SUBLANG_SAMI_NORTHERN_FINLAND 0x03 -#define SUBLANG_SERBIAN_CYRILLIC 0x03 -#define SUBLANG_SPANISH_MODERN 0x03 -#define SORT_CHINESE_BOPOMOFO 0x3 -#define SW_SHOWNOACTIVATE 4 -#define SHOW_OPENNOACTIVATE 4 -#define SW_OTHERUNZOOM 4 -#define VK_MBUTTON 0x04 -#define NF_REQUERY 4 -#define UISF_ACTIVE 0x4 -#define WMSZ_TOPLEFT 4 -#define HTGROWBOX 4 -#define MA_NOACTIVATEANDEAT 4 -#define SIZE_MAXHIDE 4 -#define MK_SHIFT 0x0004 -#define CF_SYLK 4 -#define IDRETRY 4 -#define BN_DISABLE 4 -#define BST_PUSHED 0x0004 -#define HDS_HOTTRACK 0x0004 -#define TBSTYLE_GROUP 0x0004 -#define TBS_TOP 0x0004 -#define TBS_LEFT 0x0004 -#define UDS_ALIGNRIGHT 0x0004 -#define PBS_VERTICAL 0x04 -#define LWS_NOPREFIX 0x0004 -#define LVS_SINGLESEL 0x0004 -#define TVS_LINESATROOT 0x0004 -#define TVS_EX_DOUBLEBUFFER 0x0004 -#define TCS_MULTISELECT 0x0004 -#define ACS_AUTOPLAY 0x0004 -#define MCS_WEEKNUMBERS 0x0004 -#define DTS_LONGDATEFORMAT 0x0004 -#define PGS_DRAGNDROP 0x00000004 -#define NFS_LISTCOMBO 0x0004 -#define BCSIF_STYLE 0x0004 -#define BCSS_ALIGNLEFT 0x0004 -#define LANG_CHINESE 0x04 -#define LANG_CHINESE_SIMPLIFIED 0x04 -#define SUBLANG_CUSTOM_UNSPECIFIED 0x04 -#define SUBLANG_ARABIC_LIBYA 0x04 -#define SUBLANG_CHINESE_SINGAPORE 0x04 -#define SUBLANG_CROATIAN_BOSNIA_HERZEGOVINA_LATIN 0x04 -#define SUBLANG_ENGLISH_CAN 0x04 -#define SUBLANG_FRENCH_SWISS 0x04 -#define SUBLANG_GERMAN_LUXEMBOURG 0x04 -#define SUBLANG_SAMI_LULE_NORWAY 0x04 -#define SUBLANG_SPANISH_GUATEMALA 0x04 -#define SORT_JAPANESE_RADICALSTROKE 0x4 -#define VFF_BUFFTOOSMALL 0x0004 -#define SW_SHOW 5 -#define VK_XBUTTON1 0x05 -#define WM_SIZE 0x0005 -#define WMSZ_TOPRIGHT 5 -#define HTMENU 5 -#define CF_DIF 5 -#define IDIGNORE 5 -#define BN_DOUBLECLICKED 5 -#define LANG_CZECH 0x05 -#define SUBLANG_UI_CUSTOM_DEFAULT 0x05 -#define SUBLANG_ARABIC_ALGERIA 0x05 -#define SUBLANG_BOSNIAN_BOSNIA_HERZEGOVINA_LATIN 0x05 -#define SUBLANG_CHINESE_MACAU 0x05 -#define SUBLANG_ENGLISH_NZ 0x05 -#define SUBLANG_FRENCH_LUXEMBOURG 0x05 -#define SUBLANG_GERMAN_LIECHTENSTEIN 0x05 -#define SUBLANG_SAMI_LULE_SWEDEN 0x05 -#define SUBLANG_SPANISH_COSTA_RICA 0x05 -#define SW_MINIMIZE 6 -#define VK_XBUTTON2 0x06 -#define WM_ACTIVATE 0x0006 -#define WMSZ_BOTTOM 6 -#define HTHSCROLL 6 -#define CF_TIFF 6 -#define IDYES 6 -#define BN_SETFOCUS 6 -#define LANG_DANISH 0x06 -#define SUBLANG_ARABIC_MOROCCO 0x06 -#define SUBLANG_ENGLISH_EIRE 0x06 -#define SUBLANG_FRENCH_MONACO 0x06 -#define SUBLANG_SAMI_SOUTHERN_NORWAY 0x06 -#define SUBLANG_SERBIAN_BOSNIA_HERZEGOVINA_LATIN 0x06 -#define SUBLANG_SPANISH_PANAMA 0x06 -#define VER_PRODUCTMAJORVERSION 6 -#define SW_SHOWMINNOACTIVE 7 -#define WM_SETFOCUS 0x0007 -#define WMSZ_BOTTOMLEFT 7 -#define HTVSCROLL 7 -#define CF_OEMTEXT 7 -#define IDNO 7 -#define BN_KILLFOCUS 7 -#define LANG_GERMAN 0x07 -#define SUBLANG_ARABIC_TUNISIA 0x07 -#define SUBLANG_ENGLISH_SOUTH_AFRICA 0x07 -#define SUBLANG_SAMI_SOUTHERN_SWEDEN 0x07 -#define SUBLANG_SERBIAN_BOSNIA_HERZEGOVINA_CYRILLIC 0x07 -#define SUBLANG_SPANISH_DOMINICAN_REPUBLIC 0x07 -#define SW_SHOWNA 8 -#define VK_BACK 0x08 -#define WM_KILLFOCUS 0x0008 -#define WMSZ_BOTTOMRIGHT 8 -#define HTMINBUTTON 8 -#define SMTO_NOTIMEOUTIFNOTHUNG 0x0008 -#define MK_CONTROL 0x0008 -#define CS_DBLCLKS 0x0008 -#define CF_DIB 8 -#define IDCLOSE 8 -#define BST_FOCUS 0x0008 -#define HDS_HIDDEN 0x0008 -#define TBSTYLE_DROPDOWN 0x0008 -#define TBS_BOTH 0x0008 -#define UDS_ALIGNLEFT 0x0008 -#define PBS_MARQUEE 0x08 -#define LWS_USEVISUALSTYLE 0x0008 -#define LVS_SHOWSELALWAYS 0x0008 -#define TVS_EDITLABELS 0x0008 -#define TVS_EX_NOINDENTSTATE 0x0008 -#define TCS_FLATBUTTONS 0x0008 -#define ACS_TIMER 0x0008 -#define MCS_NOTODAYCIRCLE 0x0008 -#define NFS_BUTTON 0x0008 -#define BCSIF_SIZE 0x0008 -#define BCSS_IMAGE 0x0008 -#define LANG_GREEK 0x08 -#define SUBLANG_ARABIC_OMAN 0x08 -#define SUBLANG_BOSNIAN_BOSNIA_HERZEGOVINA_CYRILLIC 0x08 -#define SUBLANG_ENGLISH_JAMAICA 0x08 -#define SUBLANG_SAMI_SKOLT_FINLAND 0x08 -#define SUBLANG_SPANISH_VENEZUELA 0x08 -#define SW_RESTORE 9 -#define VK_TAB 0x09 -#define HTMAXBUTTON 9 -#define CF_PALETTE 9 -#define IDHELP 9 -#define DTS_TIMEFORMAT 0x0009 -#define LANG_ENGLISH 0x09 -#define SUBLANG_ARABIC_YEMEN 0x09 -#define SUBLANG_ENGLISH_CARIBBEAN 0x09 -#define SUBLANG_SAMI_INARI_FINLAND 0x09 -#define SUBLANG_SPANISH_COLOMBIA 0x09 -#define SW_SHOWDEFAULT 10 -#define WM_ENABLE 0x000A -#define HTLEFT 10 -#define CF_PENDATA 10 -#define IDTRYAGAIN 10 -#define HELP_CONTEXTMENU 0x000a -#define LANG_SPANISH 0x0a -#define SUBLANG_ARABIC_SYRIA 0x0a -#define SUBLANG_ENGLISH_BELIZE 0x0a -#define SUBLANG_SPANISH_PERU 0x0a -#define SW_FORCEMINIMIZE 11 -#define SW_MAX 11 -#define WM_SETREDRAW 0x000B -#define HTRIGHT 11 -#define CF_RIFF 11 -#define IDCONTINUE 11 -#define HELP_FINDER 0x000b -#define LANG_FINNISH 0x0b -#define SUBLANG_ARABIC_JORDAN 0x0b -#define SUBLANG_ENGLISH_TRINIDAD 0x0b -#define SUBLANG_SPANISH_ARGENTINA 0x0b -#define VK_CLEAR 0x0C -#define WM_SETTEXT 0x000C -#define HTTOP 12 -#define CF_WAVE 12 -#define HELP_WM_HELP 0x000c -#define DTS_SHORTDATECENTURYFORMAT 0x000C -#define LANG_FRENCH 0x0c -#define SUBLANG_ARABIC_LEBANON 0x0c -#define SUBLANG_ENGLISH_ZIMBABWE 0x0c -#define SUBLANG_SPANISH_ECUADOR 0x0c -#define VK_RETURN 0x0D -#define WM_GETTEXT 0x000D -#define HTTOPLEFT 13 -#define CF_UNICODETEXT 13 -#define HELP_SETPOPUP_POS 0x000d -#define LANG_HEBREW 0x0d -#define SUBLANG_ARABIC_KUWAIT 0x0d -#define SUBLANG_ENGLISH_PHILIPPINES 0x0d -#define SUBLANG_SPANISH_CHILE 0x0d -#define WM_GETTEXTLENGTH 0x000E -#define HTTOPRIGHT 14 -#define CF_ENHMETAFILE 14 -#define LANG_HUNGARIAN 0x0e -#define SUBLANG_ARABIC_UAE 0x0e -#define SUBLANG_SPANISH_URUGUAY 0x0e -#define WM_PAINT 0x000F -#define HTBOTTOM 15 -#define CF_HDROP 15 -#define LANG_ICELANDIC 0x0f -#define SUBLANG_ARABIC_BAHRAIN 0x0f -#define SUBLANG_SPANISH_PARAGUAY 0x0f -#define MAXIMUM_RESERVED_MANIFEST_RESOURCE_ID 16 -#define VK_SHIFT 0x10 -#define WM_CLOSE 0x0010 -#define HTBOTTOMLEFT 16 -#define WVR_ALIGNTOP 0x0010 -#define MK_MBUTTON 0x0010 -#define TME_NONCLIENT 0x00000010 -#define CF_LOCALE 16 -#define HELP_TCARD_DATA 0x0010 -#define TBSTYLE_AUTOSIZE 0x0010 -#define TTS_NOANIMATE 0x10 -#define TBS_NOTICKS 0x0010 -#define UDS_AUTOBUDDY 0x0010 -#define PBS_SMOOTHREVERSE 0x10 -#define LWS_USECUSTOMTEXT 0x0010 -#define LVS_SORTASCENDING 0x0010 -#define TVS_DISABLEDRAGDROP 0x0010 -#define TVS_EX_RICHTOOLTIP 0x0010 -#define TCS_FORCEICONLEFT 0x0010 -#define MCS_NOTODAY 0x0010 -#define DTS_APPCANPARSE 0x0010 -#define NFS_ALL 0x0010 -#define LANG_ITALIAN 0x10 -#define SUBLANG_ARABIC_QATAR 0x10 -#define SUBLANG_ENGLISH_INDIA 0x10 -#define SUBLANG_SPANISH_BOLIVIA 0x10 -#define VK_CONTROL 0x11 -#define WM_QUERYENDSESSION 0x0011 -#define HTBOTTOMRIGHT 17 -#define CF_DIBV5 17 -#define HELP_TCARD_OTHER_CALLER 0x0011 -#define LANG_JAPANESE 0x11 -#define SUBLANG_ENGLISH_MALAYSIA 0x11 -#define SUBLANG_SPANISH_EL_SALVADOR 0x11 -#define VK_MENU 0x12 -#define WM_QUIT 0x0012 -#define HTBORDER 18 -#define CF_MAX 18 -#define LANG_KOREAN 0x12 -#define SUBLANG_ENGLISH_SINGAPORE 0x12 -#define SUBLANG_SPANISH_HONDURAS 0x12 -#define VK_PAUSE 0x13 -#define WM_QUERYOPEN 0x0013 -#define HTOBJECT 19 -#define LANG_DUTCH 0x13 -#define SUBLANG_SPANISH_NICARAGUA 0x13 -#define VK_CAPITAL 0x14 -#define WM_ERASEBKGND 0x0014 -#define HTCLOSE 20 -#define LANG_NORWEGIAN 0x14 -#define SUBLANG_SPANISH_PUERTO_RICO 0x14 -#define VK_KANA 0x15 -#define VK_HANGEUL 0x15 -#define VK_HANGUL 0x15 -#define WM_SYSCOLORCHANGE 0x0015 -#define HTHELP 21 -#define LANG_POLISH 0x15 -#define SUBLANG_SPANISH_US 0x15 -#define WM_ENDSESSION 0x0016 -#define LANG_PORTUGUESE 0x16 -#define VK_JUNJA 0x17 -#define LANG_ROMANSH 0x17 -#define RT_MANIFEST 24 -#define VK_FINAL 0x18 -#define WM_SHOWWINDOW 0x0018 -#define LANG_ROMANIAN 0x18 -#define VK_HANJA 0x19 -#define VK_KANJI 0x19 -#define LANG_RUSSIAN 0x19 -#define WM_WININICHANGE 0x001A -#define LANG_BOSNIAN 0x1a -#define LANG_CROATIAN 0x1a -#define LANG_SERBIAN 0x1a -#define VK_ESCAPE 0x1B -#define WM_DEVMODECHANGE 0x001B -#define LANG_SLOVAK 0x1b -#define VK_CONVERT 0x1C -#define WM_ACTIVATEAPP 0x001C -#define LANG_ALBANIAN 0x1c -#define VK_NONCONVERT 0x1D -#define WM_FONTCHANGE 0x001D -#define LANG_SWEDISH 0x1d -#define VK_ACCEPT 0x1E -#define WM_TIMECHANGE 0x001E -#define LANG_THAI 0x1e -#define VK_MODECHANGE 0x1F -#define WM_CANCELMODE 0x001F -#define LANG_TURKISH 0x1f -#define VK_SPACE 0x20 -#define WM_SETCURSOR 0x0020 -#define SMTO_ERRORONEXIT 0x0020 -#define WVR_ALIGNLEFT 0x0020 -#define MK_XBUTTON1 0x0020 -#define CS_OWNDC 0x0020 -#define TBSTYLE_NOPREFIX 0x0020 -#define TTS_NOFADE 0x20 -#define TBS_ENABLESELRANGE 0x0020 -#define UDS_ARROWKEYS 0x0020 -#define LWS_RIGHT 0x0020 -#define LVS_SORTDESCENDING 0x0020 -#define TVS_SHOWSELALWAYS 0x0020 -#define TVS_EX_AUTOHSCROLL 0x0020 -#define TCS_FORCELABELLEFT 0x0020 -#define DTS_RIGHTALIGN 0x0020 -#define NFS_USEFONTASSOC 0x0020 -#define LANG_URDU 0x20 -#define VK_PRIOR 0x21 -#define WM_MOUSEACTIVATE 0x0021 -#define LANG_INDONESIAN 0x21 -#define VK_NEXT 0x22 -#define WM_CHILDACTIVATE 0x0022 -#define LANG_UKRAINIAN 0x22 -#define VK_END 0x23 -#define WM_QUEUESYNC 0x0023 -#define LANG_BELARUSIAN 0x23 -#define VK_HOME 0x24 -#define WM_GETMINMAXINFO 0x0024 -#define LANG_SLOVENIAN 0x24 -#define VK_LEFT 0x25 -#define LANG_ESTONIAN 0x25 -#define VK_UP 0x26 -#define WM_PAINTICON 0x0026 -#define LANG_LATVIAN 0x26 -#define VK_RIGHT 0x27 -#define WM_ICONERASEBKGND 0x0027 -#define LANG_LITHUANIAN 0x27 -#define VK_DOWN 0x28 -#define WM_NEXTDLGCTL 0x0028 -#define LANG_TAJIK 0x28 -#define VK_SELECT 0x29 -#define LANG_FARSI 0x29 -#define LANG_PERSIAN 0x29 -#define VK_PRINT 0x2A -#define WM_SPOOLERSTATUS 0x002A -#define LANG_VIETNAMESE 0x2a -#define VK_EXECUTE 0x2B -#define WM_DRAWITEM 0x002B -#define LANG_ARMENIAN 0x2b -#define VK_SNAPSHOT 0x2C -#define WM_MEASUREITEM 0x002C -#define LANG_AZERI 0x2c -#define VK_INSERT 0x2D -#define WM_DELETEITEM 0x002D -#define LANG_BASQUE 0x2d -#define VK_DELETE 0x2E -#define WM_VKEYTOITEM 0x002E -#define LANG_LOWER_SORBIAN 0x2e -#define LANG_UPPER_SORBIAN 0x2e -#define VK_HELP 0x2F -#define WM_CHARTOITEM 0x002F -#define LANG_MACEDONIAN 0x2f -#define WM_SETFONT 0x0030 -#define WM_GETFONT 0x0031 -#define WM_SETHOTKEY 0x0032 -#define LANG_TSWANA 0x32 -#define WM_GETHOTKEY 0x0033 -#define LANG_XHOSA 0x34 -#define LANG_ZULU 0x35 -#define LANG_AFRIKAANS 0x36 -#define WM_QUERYDRAGICON 0x0037 -#define LANG_GEORGIAN 0x37 -#define LANG_FAEROESE 0x38 -#define WM_COMPAREITEM 0x0039 -#define LANG_HINDI 0x39 -#define LANG_MALTESE 0x3a -#define LANG_SAMI 0x3b -#define LANG_IRISH 0x3c -#define WM_GETOBJECT 0x003D -#define LANG_MALAY 0x3e -#define LANG_KAZAK 0x3f -#define WVR_ALIGNBOTTOM 0x0040 -#define MK_XBUTTON2 0x0040 -#define CS_CLASSDC 0x0040 -#define HDS_DRAGDROP 0x0040 -#define BTNS_SHOWTEXT 0x0040 -#define TTS_BALLOON 0x40 -#define TBS_FIXEDLENGTH 0x0040 -#define UDS_HORZ 0x0040 -#define LVS_SHAREIMAGELISTS 0x0040 -#define TVS_RTLREADING 0x0040 -#define TVS_EX_FADEINOUTEXPANDOS 0x0040 -#define TCS_HOTTRACK 0x0040 -#define MCS_NOTRAILINGDATES 0x0040 -#define LANG_KYRGYZ 0x40 -#define WM_COMPACTING 0x0041 -#define LANG_SWAHILI 0x41 -#define LANG_TURKMEN 0x42 -#define LANG_UZBEK 0x43 -#define WM_COMMNOTIFY 0x0044 -#define LANG_TATAR 0x44 -#define LANG_BENGALI 0x45 -#define WM_WINDOWPOSCHANGING 0x0046 -#define LANG_PUNJABI 0x46 -#define WM_WINDOWPOSCHANGED 0x0047 -#define LANG_GUJARATI 0x47 -#define WM_POWER 0x0048 -#define LANG_ORIYA 0x48 -#define LANG_TAMIL 0x49 -#define WM_COPYDATA 0x004A -#define LANG_TELUGU 0x4a -#define WM_CANCELJOURNAL 0x004B -#define LANG_KANNADA 0x4b -#define LANG_MALAYALAM 0x4c -#define LANG_ASSAMESE 0x4d -#define WM_NOTIFY 0x004E -#define LANG_MARATHI 0x4e -#define LANG_SANSKRIT 0x4f -#define WM_INPUTLANGCHANGEREQUEST 0x0050 -#define LANG_MONGOLIAN 0x50 -#define WM_INPUTLANGCHANGE 0x0051 -#define LANG_TIBETAN 0x51 -#define WM_TCARD 0x0052 -#define LANG_WELSH 0x52 -#define WM_HELP 0x0053 -#define LANG_KHMER 0x53 -#define WM_USERCHANGED 0x0054 -#define LANG_LAO 0x54 -#define WM_NOTIFYFORMAT 0x0055 -#define LANG_GALICIAN 0x56 -#define LANG_KONKANI 0x57 -#define LANG_MANIPURI 0x58 -#define LANG_SINDHI 0x59 -#define LANG_SYRIAC 0x5a -#define VK_LWIN 0x5B -#define LANG_SINHALESE 0x5b -#define VK_RWIN 0x5C -#define VK_APPS 0x5D -#define LANG_INUKTITUT 0x5d -#define LANG_AMHARIC 0x5e -#define VK_SLEEP 0x5F -#define LANG_TAMAZIGHT 0x5f -#define VK_NUMPAD0 0x60 -#define LANG_KASHMIRI 0x60 -#define VK_NUMPAD1 0x61 -#define LANG_NEPALI 0x61 -#define VK_NUMPAD2 0x62 -#define LANG_FRISIAN 0x62 -#define VK_NUMPAD3 0x63 -#define LANG_PASHTO 0x63 -#define VK_NUMPAD4 0x64 -#define LANG_FILIPINO 0x64 -#define VS_USER_DEFINED 100 -#define VK_NUMPAD5 0x65 -#define LANG_DIVEHI 0x65 -#define VK_NUMPAD6 0x66 -#define VK_NUMPAD7 0x67 -#define VK_NUMPAD8 0x68 -#define LANG_HAUSA 0x68 -#define VK_NUMPAD9 0x69 -#define VK_MULTIPLY 0x6A -#define LANG_YORUBA 0x6a -#define VK_ADD 0x6B -#define LANG_QUECHUA 0x6b -#define VK_SEPARATOR 0x6C -#define LANG_SOTHO 0x6c -#define VK_SUBTRACT 0x6D -#define LANG_BASHKIR 0x6d -#define VK_DECIMAL 0x6E -#define LANG_LUXEMBOURGISH 0x6e -#define VK_DIVIDE 0x6F -#define LANG_GREENLANDIC 0x6f -#define VK_F1 0x70 -#define LANG_IGBO 0x70 -#define VK_F2 0x71 -#define VK_F3 0x72 -#define VK_F4 0x73 -#define LANG_TIGRIGNA 0x73 -#define VK_F5 0x74 -#define VK_F6 0x75 -#define VK_F7 0x76 -#define VK_F8 0x77 -#define VK_F9 0x78 -#define WHEEL_DELTA 120 -#define LANG_YI 0x78 -#define VK_F10 0x79 -#define VK_F11 0x7A -#define LANG_MAPUDUNGUN 0x7a -#define VK_F12 0x7B -#define WM_CONTEXTMENU 0x007B -#define VK_F13 0x7C -#define WM_STYLECHANGING 0x007C -#define LANG_MOHAWK 0x7c -#define VK_F14 0x7D -#define WM_STYLECHANGED 0x007D -#define VK_F15 0x7E -#define WM_DISPLAYCHANGE 0x007E -#define LANG_BRETON 0x7e -#define VK_F16 0x7F -#define WM_GETICON 0x007F -#define LANG_INVARIANT 0x7f -#define VK_F17 0x80 -#define WM_SETICON 0x0080 -#define WVR_ALIGNRIGHT 0x0080 -#define CS_PARENTDC 0x0080 -#define CF_OWNERDISPLAY 0x0080 -#define HDS_FULLDRAG 0x0080 -#define BTNS_WHOLEDROPDOWN 0x0080 -#define TTS_CLOSE 0x80 -#define TBS_NOTHUMB 0x0080 -#define UDS_NOTHOUSANDS 0x0080 -#define LVS_NOLABELWRAP 0x0080 -#define TVS_NOTOOLTIPS 0x0080 -#define TVS_EX_PARTIALCHECKBOXES 0x0080 -#define TCS_VERTICAL 0x0080 -#define MCS_SHORTDAYSOFWEEK 0x0080 -#define LANG_UIGHUR 0x80 -#define VK_F18 0x81 -#define WM_NCCREATE 0x0081 -#define CF_DSPTEXT 0x0081 -#define LANG_MAORI 0x81 -#define VK_F19 0x82 -#define WM_NCDESTROY 0x0082 -#define CF_DSPBITMAP 0x0082 -#define LANG_OCCITAN 0x82 -#define VK_F20 0x83 -#define WM_NCCALCSIZE 0x0083 -#define CF_DSPMETAFILEPICT 0x0083 -#define LANG_CORSICAN 0x83 -#define VK_F21 0x84 -#define WM_NCHITTEST 0x0084 -#define LANG_ALSATIAN 0x84 -#define VK_F22 0x85 -#define WM_NCPAINT 0x0085 -#define LANG_YAKUT 0x85 -#define VK_F23 0x86 -#define WM_NCACTIVATE 0x0086 -#define LANG_KICHE 0x86 -#define VK_F24 0x87 -#define WM_GETDLGCODE 0x0087 -#define LANG_KINYARWANDA 0x87 -#define WM_SYNCPAINT 0x0088 -#define LANG_WOLOF 0x88 -#define LANG_DARI 0x8c -#define CF_DSPENHMETAFILE 0x008E -#define VK_NUMLOCK 0x90 -#define VK_SCROLL 0x91 -#define VK_OEM_NEC_EQUAL 0x92 -#define VK_OEM_FJ_JISHO 0x92 -#define VK_OEM_FJ_MASSHOU 0x93 -#define VK_OEM_FJ_TOUROKU 0x94 -#define VK_OEM_FJ_LOYA 0x95 -#define VK_OEM_FJ_ROYA 0x96 -#define VK_LSHIFT 0xA0 -#define WM_NCMOUSEMOVE 0x00A0 -#define VK_RSHIFT 0xA1 -#define WM_NCLBUTTONDOWN 0x00A1 -#define VK_LCONTROL 0xA2 -#define WM_NCLBUTTONUP 0x00A2 -#define VK_RCONTROL 0xA3 -#define WM_NCLBUTTONDBLCLK 0x00A3 -#define VK_LMENU 0xA4 -#define WM_NCRBUTTONDOWN 0x00A4 -#define VK_RMENU 0xA5 -#define WM_NCRBUTTONUP 0x00A5 -#define VK_BROWSER_BACK 0xA6 -#define WM_NCRBUTTONDBLCLK 0x00A6 -#define VK_BROWSER_FORWARD 0xA7 -#define WM_NCMBUTTONDOWN 0x00A7 -#define VK_BROWSER_REFRESH 0xA8 -#define WM_NCMBUTTONUP 0x00A8 -#define VK_BROWSER_STOP 0xA9 -#define WM_NCMBUTTONDBLCLK 0x00A9 -#define VK_BROWSER_SEARCH 0xAA -#define VK_BROWSER_FAVORITES 0xAB -#define WM_NCXBUTTONDOWN 0x00AB -#define VK_BROWSER_HOME 0xAC -#define WM_NCXBUTTONUP 0x00AC -#define VK_VOLUME_MUTE 0xAD -#define WM_NCXBUTTONDBLCLK 0x00AD -#define VK_VOLUME_DOWN 0xAE -#define VK_VOLUME_UP 0xAF -#define VK_MEDIA_NEXT_TRACK 0xB0 -#define EM_GETSEL 0x00B0 -#define VK_MEDIA_PREV_TRACK 0xB1 -#define EM_SETSEL 0x00B1 -#define VK_MEDIA_STOP 0xB2 -#define EM_GETRECT 0x00B2 -#define VK_MEDIA_PLAY_PAUSE 0xB3 -#define EM_SETRECT 0x00B3 -#define VK_LAUNCH_MAIL 0xB4 -#define EM_SETRECTNP 0x00B4 -#define VK_LAUNCH_MEDIA_SELECT 0xB5 -#define EM_SCROLL 0x00B5 -#define VK_LAUNCH_APP1 0xB6 -#define EM_LINESCROLL 0x00B6 -#define VK_LAUNCH_APP2 0xB7 -#define EM_SCROLLCARET 0x00B7 -#define EM_GETMODIFY 0x00B8 -#define EM_SETMODIFY 0x00B9 -#define VK_OEM_1 0xBA -#define EM_GETLINECOUNT 0x00BA -#define VK_OEM_PLUS 0xBB -#define EM_LINEINDEX 0x00BB -#define VK_OEM_COMMA 0xBC -#define EM_SETHANDLE 0x00BC -#define VK_OEM_MINUS 0xBD -#define EM_GETHANDLE 0x00BD -#define VK_OEM_PERIOD 0xBE -#define EM_GETTHUMB 0x00BE -#define VK_OEM_2 0xBF -#define VK_OEM_3 0xC0 -#define EM_LINELENGTH 0x00C1 -#define EM_REPLACESEL 0x00C2 -#define EM_GETLINE 0x00C4 -#define EM_LIMITTEXT 0x00C5 -#define EM_CANUNDO 0x00C6 -#define EM_UNDO 0x00C7 -#define EM_FMTLINES 0x00C8 -#define EM_LINEFROMCHAR 0x00C9 -#define EM_SETTABSTOPS 0x00CB -#define EM_SETPASSWORDCHAR 0x00CC -#define EM_EMPTYUNDOBUFFER 0x00CD -#define EM_GETFIRSTVISIBLELINE 0x00CE -#define EM_SETREADONLY 0x00CF -#define EM_SETWORDBREAKPROC 0x00D0 -#define EM_GETWORDBREAKPROC 0x00D1 -#define EM_GETPASSWORDCHAR 0x00D2 -#define EM_SETMARGINS 0x00D3 -#define EM_GETMARGINS 0x00D4 -#define EM_GETLIMITTEXT 0x00D5 -#define EM_POSFROMCHAR 0x00D6 -#define EM_CHARFROMPOS 0x00D7 -#define EM_SETIMESTATUS 0x00D8 -#define EM_GETIMESTATUS 0x00D9 -#define VK_OEM_4 0xDB -#define VK_OEM_5 0xDC -#define VK_OEM_6 0xDD -#define VK_OEM_7 0xDE -#define VK_OEM_8 0xDF -#define VK_OEM_AX 0xE1 -#define VK_OEM_102 0xE2 -#define VK_ICO_HELP 0xE3 -#define VK_ICO_00 0xE4 -#define VK_PROCESSKEY 0xE5 -#define VK_ICO_CLEAR 0xE6 -#define VK_PACKET 0xE7 -#define VK_OEM_RESET 0xE9 -#define VK_OEM_JUMP 0xEA -#define VK_OEM_PA1 0xEB -#define VK_OEM_PA2 0xEC -#define VK_OEM_PA3 0xED -#define VK_OEM_WSCTRL 0xEE -#define VK_OEM_CUSEL 0xEF -#define VK_OEM_ATTN 0xF0 -#define BM_GETCHECK 0x00F0 -#define VK_OEM_FINISH 0xF1 -#define BM_SETCHECK 0x00F1 -#define VK_OEM_COPY 0xF2 -#define BM_GETSTATE 0x00F2 -#define VK_OEM_AUTO 0xF3 -#define BM_SETSTATE 0x00F3 -#define VK_OEM_ENLW 0xF4 -#define BM_SETSTYLE 0x00F4 -#define VK_OEM_BACKTAB 0xF5 -#define BM_CLICK 0x00F5 -#define VK_ATTN 0xF6 -#define BM_GETIMAGE 0x00F6 -#define VK_CRSEL 0xF7 -#define BM_SETIMAGE 0x00F7 -#define VK_EXSEL 0xF8 -#define BM_SETDONTCLICK 0x00F8 -#define VK_EREOF 0xF9 -#define VK_PLAY 0xFA -#define VK_ZOOM 0xFB -#define VK_NONAME 0xFC -#define VK_PA1 0xFD -#define VK_OEM_CLEAR 0xFE -#define WM_INPUT_DEVICE_CHANGE 0x00FE -#define SUBVERSION_MASK 0x000000FF -#define WM_INPUT 0x00FF -#define WM_KEYFIRST 0x0100 -#define WM_KEYDOWN 0x0100 -#define WVR_HREDRAW 0x0100 -#define HDS_FILTERBAR 0x0100 -#define TBSTYLE_TOOLTIPS 0x0100 -#define RBS_TOOLTIPS 0x00000100 -#define TTS_USEVISUALSTYLE 0x100 -#define SBARS_SIZEGRIP 0x0100 -#define TBS_TOOLTIPS 0x0100 -#define UDS_HOTTRACK 0x0100 -#define LVS_AUTOARRANGE 0x0100 -#define TVS_CHECKBOXES 0x0100 -#define TVS_EX_EXCLUSIONCHECKBOXES 0x0100 -#define TCS_BUTTONS 0x0100 -#define MCS_NOSELCHANGEONNAV 0x0100 -#define WM_KEYUP 0x0101 -#define WM_CHAR 0x0102 -#define WM_DEADCHAR 0x0103 -#define WM_SYSKEYDOWN 0x0104 -#define WM_SYSKEYUP 0x0105 -#define WM_SYSCHAR 0x0106 -#define WM_SYSDEADCHAR 0x0107 -#define WM_UNICHAR 0x0109 -#define WM_KEYLAST 0x0109 -#define WM_IME_STARTCOMPOSITION 0x010D -#define WM_IME_ENDCOMPOSITION 0x010E -#define WM_IME_COMPOSITION 0x010F -#define WM_IME_KEYLAST 0x010F -#define WM_INITDIALOG 0x0110 -#define WM_COMMAND 0x0111 -#define WM_SYSCOMMAND 0x0112 -#define WM_TIMER 0x0113 -#define WM_HSCROLL 0x0114 -#define WM_VSCROLL 0x0115 -#define WM_INITMENU 0x0116 -#define WM_INITMENUPOPUP 0x0117 -#define WM_MENUSELECT 0x011F -#define WM_MENUCHAR 0x0120 -#define WM_ENTERIDLE 0x0121 -#define WM_MENURBUTTONUP 0x0122 -#define WM_MENUDRAG 0x0123 -#define WM_MENUGETOBJECT 0x0124 -#define WM_UNINITMENUPOPUP 0x0125 -#define WM_MENUCOMMAND 0x0126 -#define WM_CHANGEUISTATE 0x0127 -#define WM_UPDATEUISTATE 0x0128 -#define WM_QUERYUISTATE 0x0129 -#define WM_CTLCOLORMSGBOX 0x0132 -#define WM_CTLCOLOREDIT 0x0133 -#define WM_CTLCOLORLISTBOX 0x0134 -#define WM_CTLCOLORBTN 0x0135 -#define WM_CTLCOLORDLG 0x0136 -#define WM_CTLCOLORSCROLLBAR 0x0137 -#define WM_CTLCOLORSTATIC 0x0138 -#define MN_GETHMENU 0x01E1 -#define _WIN32_IE_IE20 0x0200 -#define WM_MOUSEFIRST 0x0200 -#define WM_MOUSEMOVE 0x0200 -#define WVR_VREDRAW 0x0200 -#define CS_NOCLOSE 0x0200 -#define CF_PRIVATEFIRST 0x0200 -#define HDS_FLAT 0x0200 -#define TBSTYLE_WRAPABLE 0x0200 -#define RBS_VARHEIGHT 0x00000200 -#define TBS_REVERSED 0x0200 -#define LVS_EDITLABELS 0x0200 -#define TVS_TRACKSELECT 0x0200 -#define TVS_EX_DIMMEDCHECKBOXES 0x0200 -#define TCS_MULTILINE 0x0200 -#define WM_LBUTTONDOWN 0x0201 -#define WM_LBUTTONUP 0x0202 -#define WM_LBUTTONDBLCLK 0x0203 -#define WM_RBUTTONDOWN 0x0204 -#define WM_RBUTTONUP 0x0205 -#define WM_RBUTTONDBLCLK 0x0206 -#define WM_MBUTTONDOWN 0x0207 -#define WM_MBUTTONUP 0x0208 -#define WM_MBUTTONDBLCLK 0x0209 -#define WM_MOUSEWHEEL 0x020A -#define WM_XBUTTONDOWN 0x020B -#define WM_XBUTTONUP 0x020C -#define WM_XBUTTONDBLCLK 0x020D -#define WM_MOUSEHWHEEL 0x020E -#define WM_MOUSELAST 0x020E -#define WM_PARENTNOTIFY 0x0210 -#define WM_ENTERMENULOOP 0x0211 -#define WM_EXITMENULOOP 0x0212 -#define WM_NEXTMENU 0x0213 -#define WM_SIZING 0x0214 -#define WM_CAPTURECHANGED 0x0215 -#define WM_MOVING 0x0216 -#define WM_POWERBROADCAST 0x0218 -#define WM_DEVICECHANGE 0x0219 -#define WM_MDICREATE 0x0220 -#define WM_MDIDESTROY 0x0221 -#define WM_MDIACTIVATE 0x0222 -#define WM_MDIRESTORE 0x0223 -#define WM_MDINEXT 0x0224 -#define WM_MDIMAXIMIZE 0x0225 -#define WM_MDITILE 0x0226 -#define WM_MDICASCADE 0x0227 -#define WM_MDIICONARRANGE 0x0228 -#define WM_MDIGETACTIVE 0x0229 -#define WM_MDISETMENU 0x0230 -#define WM_ENTERSIZEMOVE 0x0231 -#define WM_EXITSIZEMOVE 0x0232 -#define WM_DROPFILES 0x0233 -#define WM_MDIREFRESHMENU 0x0234 -#define WM_IME_SETCONTEXT 0x0281 -#define WM_IME_NOTIFY 0x0282 -#define WM_IME_CONTROL 0x0283 -#define WM_IME_COMPOSITIONFULL 0x0284 -#define WM_IME_SELECT 0x0285 -#define WM_IME_CHAR 0x0286 -#define WM_IME_REQUEST 0x0288 -#define WM_IME_KEYDOWN 0x0290 -#define WM_IME_KEYUP 0x0291 -#define WM_NCMOUSEHOVER 0x02A0 -#define WM_MOUSEHOVER 0x02A1 -#define WM_NCMOUSELEAVE 0x02A2 -#define WM_MOUSELEAVE 0x02A3 -#define WM_WTSSESSION_CHANGE 0x02B1 -#define WM_TABLET_FIRST 0x02c0 -#define WM_TABLET_LAST 0x02df -#define CF_PRIVATELAST 0x02FF -#define _WIN32_IE_IE30 0x0300 -#define WM_CUT 0x0300 -#define CF_GDIOBJFIRST 0x0300 -#define WM_COPY 0x0301 -#define _WIN32_IE_IE302 0x0302 -#define WM_PASTE 0x0302 -#define WM_CLEAR 0x0303 -#define WM_UNDO 0x0304 -#define WM_RENDERFORMAT 0x0305 -#define WM_RENDERALLFORMATS 0x0306 -#define WM_DESTROYCLIPBOARD 0x0307 -#define WM_DRAWCLIPBOARD 0x0308 -#define WM_PAINTCLIPBOARD 0x0309 -#define WM_VSCROLLCLIPBOARD 0x030A -#define WM_SIZECLIPBOARD 0x030B -#define WM_ASKCBFORMATNAME 0x030C -#define WM_CHANGECBCHAIN 0x030D -#define WM_HSCROLLCLIPBOARD 0x030E -#define WM_QUERYNEWPALETTE 0x030F -#define WM_PALETTEISCHANGING 0x0310 -#define WM_PALETTECHANGED 0x0311 -#define WM_HOTKEY 0x0312 -#define WM_PRINT 0x0317 -#define WM_PRINTCLIENT 0x0318 -#define WM_APPCOMMAND 0x0319 -#define WM_THEMECHANGED 0x031A -#define WM_CLIPBOARDUPDATE 0x031D -#define WM_DWMCOMPOSITIONCHANGED 0x031E -#define WM_DWMNCRENDERINGCHANGED 0x031F -#define WM_DWMCOLORIZATIONCOLORCHANGED 0x0320 -#define WM_DWMWINDOWMAXIMIZEDCHANGE 0x0321 -#define WM_GETTITLEBARINFOEX 0x033F -#define WM_HANDHELDFIRST 0x0358 -#define WM_HANDHELDLAST 0x035F -#define WM_AFXFIRST 0x0360 -#define WM_AFXLAST 0x037F -#define WM_PENWINFIRST 0x0380 -#define WM_PENWINLAST 0x038F -#define WM_DDE_FIRST 0x03E0 -#define CF_GDIOBJLAST 0x03FF -#define _WIN32_WINNT_NT4 0x0400 -#define _WIN32_IE_IE40 0x0400 -#define WM_USER 0x0400 -#define WVR_VALIDRECTS 0x0400 -#define HDS_CHECKBOXES 0x0400 -#define TBSTYLE_ALTDRAG 0x0400 -#define RBS_BANDBORDERS 0x00000400 -#define TBS_DOWNISLEFT 0x0400 -#define LVS_OWNERDRAWFIXED 0x0400 -#define TVS_SINGLEEXPAND 0x0400 -#define TVS_EX_DRAWIMAGEASYNC 0x0400 -#define TCS_FIXEDWIDTH 0x0400 -#define ctlFirst 0x0400 -#define psh1 0x0400 -#define _WIN32_IE_IE401 0x0401 -#define psh2 0x0401 -#define psh3 0x0402 -#define psh4 0x0403 -#define psh5 0x0404 -#define psh6 0x0405 -#define psh7 0x0406 -#define psh8 0x0407 -#define psh9 0x0408 -#define psh10 0x0409 -#define psh11 0x040a -#define psh12 0x040b -#define psh13 0x040c -#define psh14 0x040d -#define psh15 0x040e -#define psh16 0x040f -#define _WIN32_WINDOWS 0x0410 -#define chx1 0x0410 -#define chx2 0x0411 -#define chx3 0x0412 -#define chx4 0x0413 -#define chx5 0x0414 -#define chx6 0x0415 -#define chx7 0x0416 -#define chx8 0x0417 -#define chx9 0x0418 -#define chx10 0x0419 -#define chx11 0x041a -#define chx12 0x041b -#define chx13 0x041c -#define chx14 0x041d -#define chx15 0x041e -#define chx16 0x041f -#define rad1 0x0420 -#define rad2 0x0421 -#define rad3 0x0422 -#define rad4 0x0423 -#define rad5 0x0424 -#define rad6 0x0425 -#define rad7 0x0426 -#define rad8 0x0427 -#define rad9 0x0428 -#define rad10 0x0429 -#define rad11 0x042a -#define rad12 0x042b -#define rad13 0x042c -#define rad14 0x042d -#define rad15 0x042e -#define rad16 0x042f -#define grp1 0x0430 -#define grp2 0x0431 -#define grp3 0x0432 -#define grp4 0x0433 -#define frm1 0x0434 -#define frm2 0x0435 -#define frm3 0x0436 -#define frm4 0x0437 -#define rct1 0x0438 -#define rct2 0x0439 -#define rct3 0x043a -#define rct4 0x043b -#define ico1 0x043c -#define ico2 0x043d -#define ico3 0x043e -#define ico4 0x043f -#define stc1 0x0440 -#define stc2 0x0441 -#define stc3 0x0442 -#define stc4 0x0443 -#define stc5 0x0444 -#define stc6 0x0445 -#define stc7 0x0446 -#define stc8 0x0447 -#define stc9 0x0448 -#define stc10 0x0449 -#define stc11 0x044a -#define stc12 0x044b -#define stc13 0x044c -#define stc14 0x044d -#define stc15 0x044e -#define stc16 0x044f -#define stc17 0x0450 -#define stc18 0x0451 -#define stc19 0x0452 -#define stc20 0x0453 -#define stc21 0x0454 -#define stc22 0x0455 -#define stc23 0x0456 -#define stc24 0x0457 -#define stc25 0x0458 -#define stc26 0x0459 -#define stc27 0x045a -#define stc28 0x045b -#define stc29 0x045c -#define stc30 0x045d -#define stc31 0x045e -#define stc32 0x045f -#define lst1 0x0460 -#define lst2 0x0461 -#define lst3 0x0462 -#define lst4 0x0463 -#define lst5 0x0464 -#define lst6 0x0465 -#define lst7 0x0466 -#define lst8 0x0467 -#define lst9 0x0468 -#define lst10 0x0469 -#define lst11 0x046a -#define lst12 0x046b -#define lst13 0x046c -#define lst14 0x046d -#define lst15 0x046e -#define lst16 0x046f -#define cmb1 0x0470 -#define cmb2 0x0471 -#define cmb3 0x0472 -#define cmb4 0x0473 -#define cmb5 0x0474 -#define cmb6 0x0475 -#define cmb7 0x0476 -#define cmb8 0x0477 -#define cmb9 0x0478 -#define cmb10 0x0479 -#define cmb11 0x047a -#define cmb12 0x047b -#define cmb13 0x047c -#define cmb14 0x047d -#define cmb15 0x047e -#define cmb16 0x047f -#define edt1 0x0480 -#define edt2 0x0481 -#define edt3 0x0482 -#define edt4 0x0483 -#define edt5 0x0484 -#define edt6 0x0485 -#define edt7 0x0486 -#define edt8 0x0487 -#define edt9 0x0488 -#define edt10 0x0489 -#define edt11 0x048a -#define edt12 0x048b -#define edt13 0x048c -#define edt14 0x048d -#define edt15 0x048e -#define edt16 0x048f -#define scr1 0x0490 -#define scr2 0x0491 -#define scr3 0x0492 -#define scr4 0x0493 -#define scr5 0x0494 -#define scr6 0x0495 -#define scr7 0x0496 -#define scr8 0x0497 -#define ctl1 0x04A0 -#define ctlLast 0x04ff -#define _WIN32_WINNT_WIN2K 0x0500 -#define _WIN32_IE_IE50 0x0500 -#define _WIN32_WINNT_WINXP 0x0501 -#define _WIN32_IE_IE501 0x0501 -#define _WIN32_WINNT_WS03 0x0502 -#define _WIN32_IE_IE55 0x0550 -#define _WIN32_WINNT_LONGHORN 0x0600 -#define _WIN32_IE_IE60 0x0600 -//#define _WIN32_WINNT 0x0600 -#define FILEOPENORD 1536 -#define VER_PRODUCTVERSION_W 0x0600 -#define _WIN32_IE_IE60SP1 0x0601 -#define MULTIFILEOPENORD 1537 -#define _WIN32_IE_WS03 0x0602 -#define PRINTDLGORD 1538 -#define _WIN32_IE_IE60SP2 0x0603 -#define PRNSETUPDLGORD 1539 -#define FINDDLGORD 1540 -#define REPLACEDLGORD 1541 -#define FONTDLGORD 1542 -#define FORMATDLGORD31 1543 -#define FORMATDLGORD30 1544 -#define RUNDLGORD 1545 -#define PAGESETUPDLGORD 1546 -#define NEWFILEOPENORD 1547 -#define PRINTDLGEXORD 1549 -#define PAGESETUPDLGORDMOTIF 1550 -#define COLORMGMTDLGORD 1551 -#define NEWFILEOPENV2ORD 1552 -#define NEWFILEOPENV3ORD 1553 -#define _WIN32_IE_IE70 0x0700 -#define _WIN32_IE 0x0700 -#define CS_SAVEBITS 0x0800 -#define HDS_NOSIZING 0x0800 -#define TBSTYLE_FLAT 0x0800 -#define RBS_FIXEDORDER 0x00000800 -#define SBARS_TOOLTIPS 0x0800 -#define SBT_TOOLTIPS 0x0800 -#define TBS_NOTIFYBEFOREMOVE 0x0800 -#define LVS_ALIGNLEFT 0x0800 -#define TVS_INFOTIP 0x0800 -#define TCS_RAGGEDRIGHT 0x0800 -#define LVS_ALIGNMASK 0x0c00 -#define CS_BYTEALIGNCLIENT 0x1000 -#define HDS_OVERFLOW 0x1000 -#define TBSTYLE_LIST 0x1000 -#define RBS_REGISTERDROP 0x00001000 -#define TBS_TRANSPARENTBKGND 0x1000 -#define LVS_OWNERDATA 0x1000 -#define TVS_FULLROWSELECT 0x1000 -#define TCS_FOCUSONBUTTONDOWN 0x1000 -#define VER_PRODUCTBUILD 6000 -#define CS_BYTEALIGNWINDOW 0x2000 -#define TBSTYLE_CUSTOMERASE 0x2000 -#define RBS_AUTOSIZE 0x00002000 -#define LVS_NOSCROLL 0x2000 -#define TVS_NOSCROLL 0x2000 -#define TCS_OWNERDRAWFIXED 0x2000 -#define CS_GLOBALCLASS 0x4000 -#define TBSTYLE_REGISTERDROP 0x4000 -#define RBS_VERTICALGRIPPER 0x00004000 -#define LVS_NOCOLUMNHEADER 0x4000 -#define TVS_NONEVENHEIGHT 0x4000 -#define TCS_TOOLTIPS 0x4000 -#define VER_PRODUCTBUILD_QFE 16384 -#define IDH_NO_HELP 28440 -#define IDH_MISSING_CONTEXT 28441 -#define IDH_GENERIC_HELP_BUTTON 28442 -#define IDH_OK 28443 -#define IDH_CANCEL 28444 -#define IDH_HELP 28445 -#define LANG_BOSNIAN_NEUTRAL 0x781a -#define LANG_CHINESE_TRADITIONAL 0x7c04 -#define LANG_SERBIAN_NEUTRAL 0x7c1a -#define IDTIMEOUT 32000 -#define OCR_NORMAL 32512 -#define OIC_SAMPLE 32512 -#define IDI_APPLICATION 32512 -#define OCR_IBEAM 32513 -#define OIC_HAND 32513 -#define IDI_HAND 32513 -#define OCR_WAIT 32514 -#define OIC_QUES 32514 -#define IDI_QUESTION 32514 -#define OCR_CROSS 32515 -#define OIC_BANG 32515 -#define IDI_EXCLAMATION 32515 -#define OCR_UP 32516 -#define OIC_NOTE 32516 -#define IDI_ASTERISK 32516 -#define OIC_WINLOGO 32517 -#define IDI_WINLOGO 32517 -#define OIC_SHIELD 32518 -#define IDI_SHIELD 32518 -#define OCR_SIZE 32640 -#define OCR_ICON 32641 -#define OCR_SIZENWSE 32642 -#define OCR_SIZENESW 32643 -#define OCR_SIZEWE 32644 -#define OCR_SIZENS 32645 -#define OCR_SIZEALL 32646 -#define OCR_ICOCUR 32647 -#define OCR_NO 32648 -#define OCR_HAND 32649 -#define OCR_APPSTARTING 32650 -#define OBM_LFARROWI 32734 -#define OBM_RGARROWI 32735 -#define OBM_DNARROWI 32736 -#define OBM_UPARROWI 32737 -#define OBM_COMBO 32738 -#define OBM_MNARROW 32739 -#define OBM_LFARROWD 32740 -#define OBM_RGARROWD 32741 -#define OBM_DNARROWD 32742 -#define OBM_UPARROWD 32743 -#define OBM_RESTORED 32744 -#define OBM_ZOOMD 32745 -#define OBM_REDUCED 32746 -#define OBM_RESTORE 32747 -#define OBM_ZOOM 32748 -#define OBM_REDUCE 32749 -#define OBM_LFARROW 32750 -#define OBM_RGARROW 32751 -#define OBM_DNARROW 32752 -#define OBM_UPARROW 32753 -#define OBM_CLOSE 32754 -#define OBM_OLD_RESTORE 32755 -#define OBM_OLD_ZOOM 32756 -#define OBM_OLD_REDUCE 32757 -#define OBM_BTNCORNERS 32758 -#define OBM_CHECKBOXES 32759 -#define OBM_CHECK 32760 -#define OBM_BTSIZE 32761 -#define OBM_OLD_LFARROW 32762 -#define OBM_OLD_RGARROW 32763 -#define OBM_OLD_DNARROW 32764 -#define OBM_OLD_UPARROW 32765 -#define OBM_SIZE 32766 -#define OBM_OLD_CLOSE 32767 -#define WM_APP 0x8000 -#define HELP_TCARD 0x8000 -#define TBSTYLE_TRANSPARENT 0x8000 -#define RBS_DBLCLKTOGGLE 0x00008000 -#define LVS_NOSORTHEADER 0x8000 -#define TVS_NOHSCROLL 0x8000 -#define TCS_FOCUSNEVER 0x8000 -#define SC_SIZE 0xF000 -#define SC_SEPARATOR 0xF00F -#define SC_MOVE 0xF010 -#define SC_MINIMIZE 0xF020 -#define SC_MAXIMIZE 0xF030 -#define SC_NEXTWINDOW 0xF040 -#define SC_PREVWINDOW 0xF050 -#define SC_CLOSE 0xF060 -#define SC_VSCROLL 0xF070 -#define SC_HSCROLL 0xF080 -#define SC_MOUSEMENU 0xF090 -#define SC_KEYMENU 0xF100 -#define SC_ARRANGE 0xF110 -#define SC_RESTORE 0xF120 -#define SC_TASKLIST 0xF130 -#define SC_SCREENSAVE 0xF140 -#define SC_HOTKEY 0xF150 -#define SC_DEFAULT 0xF160 -#define SC_MONITORPOWER 0xF170 -#define SC_CONTEXTHELP 0xF180 -#define LVS_TYPESTYLEMASK 0xfc00 -#define SPVERSION_MASK 0x0000FF00 -#define HTERROR -2 -#define PWR_FAIL -1 -#define UNICODE_NOCHAR 0xFFFF -#define HTTRANSPARENT -1 - -// Next default values for new objects -// -#ifdef APSTUDIO_INVOKED -#ifndef APSTUDIO_READONLY_SYMBOLS -#define _APS_NEXT_RESOURCE_VALUE 101 -#define _APS_NEXT_COMMAND_VALUE 40001 -#define _APS_NEXT_CONTROL_VALUE 1000 -#define _APS_NEXT_SYMED_VALUE 101 -#endif -#endif +//{{NO_DEPENDENCIES}} +// Microsoft Visual C++ generated include file. +// Used by Skeleton.rc +// +#define SW_HIDE 0 +#define HIDE_WINDOW 0 +#define WM_NULL 0x0000 +#define WA_INACTIVE 0 +#define HTNOWHERE 0 +#define SMTO_NORMAL 0x0000 +#define ICON_SMALL 0 +#define SIZE_RESTORED 0 +#define BN_CLICKED 0 +#define BST_UNCHECKED 0x0000 +#define HDS_HORZ 0x0000 +#define TBSTYLE_BUTTON 0x0000 +#define TBS_HORZ 0x0000 +#define TBS_BOTTOM 0x0000 +#define TBS_RIGHT 0x0000 +#define LVS_ICON 0x0000 +#define LVS_ALIGNTOP 0x0000 +#define TCS_TABS 0x0000 +#define TCS_SINGLELINE 0x0000 +#define TCS_RIGHTJUSTIFY 0x0000 +#define DTS_SHORTDATEFORMAT 0x0000 +#define PGS_VERT 0x00000000 +#define LANG_NEUTRAL 0x00 +#define SUBLANG_NEUTRAL 0x00 +#define SORT_DEFAULT 0x0 +#define SORT_JAPANESE_XJIS 0x0 +#define SORT_CHINESE_BIG5 0x0 +#define SORT_CHINESE_PRCP 0x0 +#define SORT_KOREAN_KSC 0x0 +#define SORT_HUNGARIAN_DEFAULT 0x0 +#define SORT_GEORGIAN_TRADITIONAL 0x0 +#define _USE_DECLSPECS_FOR_SAL 0 +#define _USE_ATTRIBUTES_FOR_SAL 0 +#define VER_PRODUCTMINORVERSION 0 +#define VER_DEBUG 0 +#define VER_PRERELEASE 0 +#define CREATEPROCESS_MANIFEST_RESOURCE_ID 1 +#define MINIMUM_RESERVED_MANIFEST_RESOURCE_ID 1 +#define SW_SHOWNORMAL 1 +#define SW_NORMAL 1 +#define SHOW_OPENWINDOW 1 +#define SW_PARENTCLOSING 1 +#define VK_LBUTTON 0x01 +#define WM_CREATE 0x0001 +#define WA_ACTIVE 1 +#define PWR_OK 1 +#define PWR_SUSPENDREQUEST 1 +#define NFR_ANSI 1 +#define UIS_SET 1 +#define UISF_HIDEFOCUS 0x1 +#define XBUTTON1 0x0001 +#define WMSZ_LEFT 1 +#define HTCLIENT 1 +#define SMTO_BLOCK 0x0001 +#define MA_ACTIVATE 1 +#define ICON_BIG 1 +#define SIZE_MINIMIZED 1 +#define MK_LBUTTON 0x0001 +#define TME_HOVER 0x00000001 +#define CS_VREDRAW 0x0001 +#define CF_TEXT 1 +#define SCF_ISSECURE 0x00000001 +#define IDOK 1 +#define BN_PAINT 1 +#define BST_CHECKED 0x0001 +#define TBSTYLE_SEP 0x0001 +#define TTS_ALWAYSTIP 0x01 +#define TBS_AUTOTICKS 0x0001 +#define UDS_WRAP 0x0001 +#define PBS_SMOOTH 0x01 +#define LWS_TRANSPARENT 0x0001 +#define LVS_REPORT 0x0001 +#define TVS_HASBUTTONS 0x0001 +#define TCS_SCROLLOPPOSITE 0x0001 +#define ACS_CENTER 0x0001 +#define MCS_DAYSTATE 0x0001 +#define DTS_UPDOWN 0x0001 +#define PGS_HORZ 0x00000001 +#define NFS_EDIT 0x0001 +#define BCSIF_GLYPH 0x0001 +#define BCSS_NOSPLIT 0x0001 +#define LANG_ARABIC 0x01 +#define SUBLANG_DEFAULT 0x01 +#define SUBLANG_AFRIKAANS_SOUTH_AFRICA 0x01 +#define SUBLANG_ALBANIAN_ALBANIA 0x01 +#define SUBLANG_ALSATIAN_FRANCE 0x01 +#define SUBLANG_AMHARIC_ETHIOPIA 0x01 +#define SUBLANG_ARABIC_SAUDI_ARABIA 0x01 +#define SUBLANG_ARMENIAN_ARMENIA 0x01 +#define SUBLANG_ASSAMESE_INDIA 0x01 +#define SUBLANG_AZERI_LATIN 0x01 +#define SUBLANG_BASHKIR_RUSSIA 0x01 +#define SUBLANG_BASQUE_BASQUE 0x01 +#define SUBLANG_BELARUSIAN_BELARUS 0x01 +#define SUBLANG_BENGALI_INDIA 0x01 +#define SUBLANG_BRETON_FRANCE 0x01 +#define SUBLANG_BULGARIAN_BULGARIA 0x01 +#define SUBLANG_CATALAN_CATALAN 0x01 +#define SUBLANG_CHINESE_TRADITIONAL 0x01 +#define SUBLANG_CORSICAN_FRANCE 0x01 +#define SUBLANG_CZECH_CZECH_REPUBLIC 0x01 +#define SUBLANG_CROATIAN_CROATIA 0x01 +#define SUBLANG_DANISH_DENMARK 0x01 +#define SUBLANG_DARI_AFGHANISTAN 0x01 +#define SUBLANG_DIVEHI_MALDIVES 0x01 +#define SUBLANG_DUTCH 0x01 +#define SUBLANG_ENGLISH_US 0x01 +#define SUBLANG_ESTONIAN_ESTONIA 0x01 +#define SUBLANG_FAEROESE_FAROE_ISLANDS 0x01 +#define SUBLANG_FILIPINO_PHILIPPINES 0x01 +#define SUBLANG_FINNISH_FINLAND 0x01 +#define SUBLANG_FRENCH 0x01 +#define SUBLANG_FRISIAN_NETHERLANDS 0x01 +#define SUBLANG_GALICIAN_GALICIAN 0x01 +#define SUBLANG_GEORGIAN_GEORGIA 0x01 +#define SUBLANG_GERMAN 0x01 +#define SUBLANG_GREEK_GREECE 0x01 +#define SUBLANG_GREENLANDIC_GREENLAND 0x01 +#define SUBLANG_GUJARATI_INDIA 0x01 +#define SUBLANG_HAUSA_NIGERIA_LATIN 0x01 +#define SUBLANG_HEBREW_ISRAEL 0x01 +#define SUBLANG_HINDI_INDIA 0x01 +#define SUBLANG_HUNGARIAN_HUNGARY 0x01 +#define SUBLANG_ICELANDIC_ICELAND 0x01 +#define SUBLANG_IGBO_NIGERIA 0x01 +#define SUBLANG_INDONESIAN_INDONESIA 0x01 +#define SUBLANG_INUKTITUT_CANADA 0x01 +#define SUBLANG_ITALIAN 0x01 +#define SUBLANG_JAPANESE_JAPAN 0x01 +#define SUBLANG_KANNADA_INDIA 0x01 +#define SUBLANG_KAZAK_KAZAKHSTAN 0x01 +#define SUBLANG_KHMER_CAMBODIA 0x01 +#define SUBLANG_KICHE_GUATEMALA 0x01 +#define SUBLANG_KINYARWANDA_RWANDA 0x01 +#define SUBLANG_KONKANI_INDIA 0x01 +#define SUBLANG_KOREAN 0x01 +#define SUBLANG_KYRGYZ_KYRGYZSTAN 0x01 +#define SUBLANG_LAO_LAO 0x01 +#define SUBLANG_LATVIAN_LATVIA 0x01 +#define SUBLANG_LITHUANIAN 0x01 +#define SUBLANG_LUXEMBOURGISH_LUXEMBOURG 0x01 +#define SUBLANG_MACEDONIAN_MACEDONIA 0x01 +#define SUBLANG_MALAY_MALAYSIA 0x01 +#define SUBLANG_MALAYALAM_INDIA 0x01 +#define SUBLANG_MALTESE_MALTA 0x01 +#define SUBLANG_MAORI_NEW_ZEALAND 0x01 +#define SUBLANG_MAPUDUNGUN_CHILE 0x01 +#define SUBLANG_MARATHI_INDIA 0x01 +#define SUBLANG_MOHAWK_MOHAWK 0x01 +#define SUBLANG_MONGOLIAN_CYRILLIC_MONGOLIA 0x01 +#define SUBLANG_NEPALI_NEPAL 0x01 +#define SUBLANG_NORWEGIAN_BOKMAL 0x01 +#define SUBLANG_OCCITAN_FRANCE 0x01 +#define SUBLANG_ORIYA_INDIA 0x01 +#define SUBLANG_PASHTO_AFGHANISTAN 0x01 +#define SUBLANG_PERSIAN_IRAN 0x01 +#define SUBLANG_POLISH_POLAND 0x01 +#define SUBLANG_PORTUGUESE_BRAZILIAN 0x01 +#define SUBLANG_PUNJABI_INDIA 0x01 +#define SUBLANG_QUECHUA_BOLIVIA 0x01 +#define SUBLANG_ROMANIAN_ROMANIA 0x01 +#define SUBLANG_ROMANSH_SWITZERLAND 0x01 +#define SUBLANG_RUSSIAN_RUSSIA 0x01 +#define SUBLANG_SAMI_NORTHERN_NORWAY 0x01 +#define SUBLANG_SANSKRIT_INDIA 0x01 +#define SUBLANG_SERBIAN_CROATIA 0x01 +#define SUBLANG_SINDHI_INDIA 0x01 +#define SUBLANG_SINHALESE_SRI_LANKA 0x01 +#define SUBLANG_SOTHO_NORTHERN_SOUTH_AFRICA 0x01 +#define SUBLANG_SLOVAK_SLOVAKIA 0x01 +#define SUBLANG_SLOVENIAN_SLOVENIA 0x01 +#define SUBLANG_SPANISH 0x01 +#define SUBLANG_SWAHILI_KENYA 0x01 +#define SUBLANG_SWEDISH 0x01 +#define SUBLANG_SYRIAC_SYRIA 0x01 +#define SUBLANG_TAJIK_TAJIKISTAN 0x01 +#define SUBLANG_TAMIL_INDIA 0x01 +#define SUBLANG_TATAR_RUSSIA 0x01 +#define SUBLANG_TELUGU_INDIA 0x01 +#define SUBLANG_THAI_THAILAND 0x01 +#define SUBLANG_TIBETAN_PRC 0x01 +#define SUBLANG_TSWANA_SOUTH_AFRICA 0x01 +#define SUBLANG_TURKISH_TURKEY 0x01 +#define SUBLANG_TURKMEN_TURKMENISTAN 0x01 +#define SUBLANG_UIGHUR_PRC 0x01 +#define SUBLANG_UKRAINIAN_UKRAINE 0x01 +#define SUBLANG_UPPER_SORBIAN_GERMANY 0x01 +#define SUBLANG_URDU_PAKISTAN 0x01 +#define SUBLANG_UZBEK_LATIN 0x01 +#define SUBLANG_VIETNAMESE_VIETNAM 0x01 +#define SUBLANG_WELSH_UNITED_KINGDOM 0x01 +#define SUBLANG_WOLOF_SENEGAL 0x01 +#define SUBLANG_XHOSA_SOUTH_AFRICA 0x01 +#define SUBLANG_YAKUT_RUSSIA 0x01 +#define SUBLANG_YI_PRC 0x01 +#define SUBLANG_YORUBA_NIGERIA 0x01 +#define SUBLANG_ZULU_SOUTH_AFRICA 0x01 +#define SORT_INVARIANT_MATH 0x1 +#define SORT_JAPANESE_UNICODE 0x1 +#define SORT_CHINESE_UNICODE 0x1 +#define SORT_KOREAN_UNICODE 0x1 +#define SORT_GERMAN_PHONE_BOOK 0x1 +#define SORT_HUNGARIAN_TECHNICAL 0x1 +#define SORT_GEORGIAN_MODERN 0x1 +#define VS_VERSION_INFO 1 +#define VFFF_ISSHAREDFILE 0x0001 +#define VFF_CURNEDEST 0x0001 +#define VIFF_FORCEINSTALL 0x0001 +#define ISOLATIONAWARE_MANIFEST_RESOURCE_ID 2 +#define SW_SHOWMINIMIZED 2 +#define SHOW_ICONWINDOW 2 +#define SW_OTHERZOOM 2 +#define VK_RBUTTON 0x02 +#define WM_DESTROY 0x0002 +#define WA_CLICKACTIVE 2 +#define PWR_SUSPENDRESUME 2 +#define NFR_UNICODE 2 +#define UIS_CLEAR 2 +#define UISF_HIDEACCEL 0x2 +#define XBUTTON2 0x0002 +#define WMSZ_RIGHT 2 +#define HTCAPTION 2 +#define SMTO_ABORTIFHUNG 0x0002 +#define MA_ACTIVATEANDEAT 2 +#define ICON_SMALL2 2 +#define SIZE_MAXIMIZED 2 +#define MK_RBUTTON 0x0002 +#define TME_LEAVE 0x00000002 +#define CS_HREDRAW 0x0002 +#define CF_BITMAP 2 +#define IDCANCEL 2 +#define BN_HILITE 2 +#define BST_INDETERMINATE 0x0002 +#define HDS_BUTTONS 0x0002 +#define TBSTYLE_CHECK 0x0002 +#define TTS_NOPREFIX 0x02 +#define TBS_VERT 0x0002 +#define UDS_SETBUDDYINT 0x0002 +#define LWS_IGNORERETURN 0x0002 +#define LVS_SMALLICON 0x0002 +#define TVS_HASLINES 0x0002 +#define TVS_EX_MULTISELECT 0x0002 +#define TCS_BOTTOM 0x0002 +#define TCS_RIGHT 0x0002 +#define ACS_TRANSPARENT 0x0002 +#define MCS_MULTISELECT 0x0002 +#define DTS_SHOWNONE 0x0002 +#define PGS_AUTOSCROLL 0x00000002 +#define NFS_STATIC 0x0002 +#define BCSIF_IMAGE 0x0002 +#define BCSS_STRETCH 0x0002 +#define LANG_BULGARIAN 0x02 +#define SUBLANG_SYS_DEFAULT 0x02 +#define SUBLANG_ARABIC_IRAQ 0x02 +#define SUBLANG_AZERI_CYRILLIC 0x02 +#define SUBLANG_BENGALI_BANGLADESH 0x02 +#define SUBLANG_CHINESE_SIMPLIFIED 0x02 +#define SUBLANG_DUTCH_BELGIAN 0x02 +#define SUBLANG_ENGLISH_UK 0x02 +#define SUBLANG_FRENCH_BELGIAN 0x02 +#define SUBLANG_GERMAN_SWISS 0x02 +#define SUBLANG_INUKTITUT_CANADA_LATIN 0x02 +#define SUBLANG_IRISH_IRELAND 0x02 +#define SUBLANG_ITALIAN_SWISS 0x02 +#define SUBLANG_KASHMIRI_SASIA 0x02 +#define SUBLANG_KASHMIRI_INDIA 0x02 +#define SUBLANG_LOWER_SORBIAN_GERMANY 0x02 +#define SUBLANG_MALAY_BRUNEI_DARUSSALAM 0x02 +#define SUBLANG_MONGOLIAN_PRC 0x02 +#define SUBLANG_NEPALI_INDIA 0x02 +#define SUBLANG_NORWEGIAN_NYNORSK 0x02 +#define SUBLANG_PORTUGUESE 0x02 +#define SUBLANG_QUECHUA_ECUADOR 0x02 +#define SUBLANG_SAMI_NORTHERN_SWEDEN 0x02 +#define SUBLANG_SERBIAN_LATIN 0x02 +#define SUBLANG_SINDHI_PAKISTAN 0x02 +#define SUBLANG_SINDHI_AFGHANISTAN 0x02 +#define SUBLANG_SPANISH_MEXICAN 0x02 +#define SUBLANG_SWEDISH_FINLAND 0x02 +#define SUBLANG_TAMAZIGHT_ALGERIA_LATIN 0x02 +#define SUBLANG_TIGRIGNA_ERITREA 0x02 +#define SUBLANG_URDU_INDIA 0x02 +#define SUBLANG_UZBEK_CYRILLIC 0x02 +#define SORT_CHINESE_PRC 0x2 +#define VFF_FILEINUSE 0x0002 +#define VIFF_DONTDELETEOLD 0x0002 +#define ISOLATIONAWARE_NOSTATICIMPORT_MANIFEST_RESOURCE_ID 3 +#define SW_SHOWMAXIMIZED 3 +#define SW_MAXIMIZE 3 +#define SHOW_FULLSCREEN 3 +#define SW_PARENTOPENING 3 +#define VK_CANCEL 0x03 +#define WM_MOVE 0x0003 +#define PWR_CRITICALRESUME 3 +#define NF_QUERY 3 +#define UIS_INITIALIZE 3 +#define WMSZ_TOP 3 +#define HTSYSMENU 3 +#define MA_NOACTIVATE 3 +#define SIZE_MAXSHOW 3 +#define CF_METAFILEPICT 3 +#define IDABORT 3 +#define BN_UNHILITE 3 +#define LVS_LIST 0x0003 +#define LVS_TYPEMASK 0x0003 +#define LANG_CATALAN 0x03 +#define SUBLANG_CUSTOM_DEFAULT 0x03 +#define SUBLANG_ARABIC_EGYPT 0x03 +#define SUBLANG_CHINESE_HONGKONG 0x03 +#define SUBLANG_ENGLISH_AUS 0x03 +#define SUBLANG_FRENCH_CANADIAN 0x03 +#define SUBLANG_GERMAN_AUSTRIAN 0x03 +#define SUBLANG_QUECHUA_PERU 0x03 +#define SUBLANG_SAMI_NORTHERN_FINLAND 0x03 +#define SUBLANG_SERBIAN_CYRILLIC 0x03 +#define SUBLANG_SPANISH_MODERN 0x03 +#define SORT_CHINESE_BOPOMOFO 0x3 +#define SW_SHOWNOACTIVATE 4 +#define SHOW_OPENNOACTIVATE 4 +#define SW_OTHERUNZOOM 4 +#define VK_MBUTTON 0x04 +#define NF_REQUERY 4 +#define UISF_ACTIVE 0x4 +#define WMSZ_TOPLEFT 4 +#define HTGROWBOX 4 +#define MA_NOACTIVATEANDEAT 4 +#define SIZE_MAXHIDE 4 +#define MK_SHIFT 0x0004 +#define CF_SYLK 4 +#define IDRETRY 4 +#define BN_DISABLE 4 +#define BST_PUSHED 0x0004 +#define HDS_HOTTRACK 0x0004 +#define TBSTYLE_GROUP 0x0004 +#define TBS_TOP 0x0004 +#define TBS_LEFT 0x0004 +#define UDS_ALIGNRIGHT 0x0004 +#define PBS_VERTICAL 0x04 +#define LWS_NOPREFIX 0x0004 +#define LVS_SINGLESEL 0x0004 +#define TVS_LINESATROOT 0x0004 +#define TVS_EX_DOUBLEBUFFER 0x0004 +#define TCS_MULTISELECT 0x0004 +#define ACS_AUTOPLAY 0x0004 +#define MCS_WEEKNUMBERS 0x0004 +#define DTS_LONGDATEFORMAT 0x0004 +#define PGS_DRAGNDROP 0x00000004 +#define NFS_LISTCOMBO 0x0004 +#define BCSIF_STYLE 0x0004 +#define BCSS_ALIGNLEFT 0x0004 +#define LANG_CHINESE 0x04 +#define LANG_CHINESE_SIMPLIFIED 0x04 +#define SUBLANG_CUSTOM_UNSPECIFIED 0x04 +#define SUBLANG_ARABIC_LIBYA 0x04 +#define SUBLANG_CHINESE_SINGAPORE 0x04 +#define SUBLANG_CROATIAN_BOSNIA_HERZEGOVINA_LATIN 0x04 +#define SUBLANG_ENGLISH_CAN 0x04 +#define SUBLANG_FRENCH_SWISS 0x04 +#define SUBLANG_GERMAN_LUXEMBOURG 0x04 +#define SUBLANG_SAMI_LULE_NORWAY 0x04 +#define SUBLANG_SPANISH_GUATEMALA 0x04 +#define SORT_JAPANESE_RADICALSTROKE 0x4 +#define VFF_BUFFTOOSMALL 0x0004 +#define SW_SHOW 5 +#define VK_XBUTTON1 0x05 +#define WM_SIZE 0x0005 +#define WMSZ_TOPRIGHT 5 +#define HTMENU 5 +#define CF_DIF 5 +#define IDIGNORE 5 +#define BN_DOUBLECLICKED 5 +#define LANG_CZECH 0x05 +#define SUBLANG_UI_CUSTOM_DEFAULT 0x05 +#define SUBLANG_ARABIC_ALGERIA 0x05 +#define SUBLANG_BOSNIAN_BOSNIA_HERZEGOVINA_LATIN 0x05 +#define SUBLANG_CHINESE_MACAU 0x05 +#define SUBLANG_ENGLISH_NZ 0x05 +#define SUBLANG_FRENCH_LUXEMBOURG 0x05 +#define SUBLANG_GERMAN_LIECHTENSTEIN 0x05 +#define SUBLANG_SAMI_LULE_SWEDEN 0x05 +#define SUBLANG_SPANISH_COSTA_RICA 0x05 +#define SW_MINIMIZE 6 +#define VK_XBUTTON2 0x06 +#define WM_ACTIVATE 0x0006 +#define WMSZ_BOTTOM 6 +#define HTHSCROLL 6 +#define CF_TIFF 6 +#define IDYES 6 +#define BN_SETFOCUS 6 +#define LANG_DANISH 0x06 +#define SUBLANG_ARABIC_MOROCCO 0x06 +#define SUBLANG_ENGLISH_EIRE 0x06 +#define SUBLANG_FRENCH_MONACO 0x06 +#define SUBLANG_SAMI_SOUTHERN_NORWAY 0x06 +#define SUBLANG_SERBIAN_BOSNIA_HERZEGOVINA_LATIN 0x06 +#define SUBLANG_SPANISH_PANAMA 0x06 +#define VER_PRODUCTMAJORVERSION 6 +#define SW_SHOWMINNOACTIVE 7 +#define WM_SETFOCUS 0x0007 +#define WMSZ_BOTTOMLEFT 7 +#define HTVSCROLL 7 +#define CF_OEMTEXT 7 +#define IDNO 7 +#define BN_KILLFOCUS 7 +#define LANG_GERMAN 0x07 +#define SUBLANG_ARABIC_TUNISIA 0x07 +#define SUBLANG_ENGLISH_SOUTH_AFRICA 0x07 +#define SUBLANG_SAMI_SOUTHERN_SWEDEN 0x07 +#define SUBLANG_SERBIAN_BOSNIA_HERZEGOVINA_CYRILLIC 0x07 +#define SUBLANG_SPANISH_DOMINICAN_REPUBLIC 0x07 +#define SW_SHOWNA 8 +#define VK_BACK 0x08 +#define WM_KILLFOCUS 0x0008 +#define WMSZ_BOTTOMRIGHT 8 +#define HTMINBUTTON 8 +#define SMTO_NOTIMEOUTIFNOTHUNG 0x0008 +#define MK_CONTROL 0x0008 +#define CS_DBLCLKS 0x0008 +#define CF_DIB 8 +#define IDCLOSE 8 +#define BST_FOCUS 0x0008 +#define HDS_HIDDEN 0x0008 +#define TBSTYLE_DROPDOWN 0x0008 +#define TBS_BOTH 0x0008 +#define UDS_ALIGNLEFT 0x0008 +#define PBS_MARQUEE 0x08 +#define LWS_USEVISUALSTYLE 0x0008 +#define LVS_SHOWSELALWAYS 0x0008 +#define TVS_EDITLABELS 0x0008 +#define TVS_EX_NOINDENTSTATE 0x0008 +#define TCS_FLATBUTTONS 0x0008 +#define ACS_TIMER 0x0008 +#define MCS_NOTODAYCIRCLE 0x0008 +#define NFS_BUTTON 0x0008 +#define BCSIF_SIZE 0x0008 +#define BCSS_IMAGE 0x0008 +#define LANG_GREEK 0x08 +#define SUBLANG_ARABIC_OMAN 0x08 +#define SUBLANG_BOSNIAN_BOSNIA_HERZEGOVINA_CYRILLIC 0x08 +#define SUBLANG_ENGLISH_JAMAICA 0x08 +#define SUBLANG_SAMI_SKOLT_FINLAND 0x08 +#define SUBLANG_SPANISH_VENEZUELA 0x08 +#define SW_RESTORE 9 +#define VK_TAB 0x09 +#define HTMAXBUTTON 9 +#define CF_PALETTE 9 +#define IDHELP 9 +#define DTS_TIMEFORMAT 0x0009 +#define LANG_ENGLISH 0x09 +#define SUBLANG_ARABIC_YEMEN 0x09 +#define SUBLANG_ENGLISH_CARIBBEAN 0x09 +#define SUBLANG_SAMI_INARI_FINLAND 0x09 +#define SUBLANG_SPANISH_COLOMBIA 0x09 +#define SW_SHOWDEFAULT 10 +#define WM_ENABLE 0x000A +#define HTLEFT 10 +#define CF_PENDATA 10 +#define IDTRYAGAIN 10 +#define HELP_CONTEXTMENU 0x000a +#define LANG_SPANISH 0x0a +#define SUBLANG_ARABIC_SYRIA 0x0a +#define SUBLANG_ENGLISH_BELIZE 0x0a +#define SUBLANG_SPANISH_PERU 0x0a +#define SW_FORCEMINIMIZE 11 +#define SW_MAX 11 +#define WM_SETREDRAW 0x000B +#define HTRIGHT 11 +#define CF_RIFF 11 +#define IDCONTINUE 11 +#define HELP_FINDER 0x000b +#define LANG_FINNISH 0x0b +#define SUBLANG_ARABIC_JORDAN 0x0b +#define SUBLANG_ENGLISH_TRINIDAD 0x0b +#define SUBLANG_SPANISH_ARGENTINA 0x0b +#define VK_CLEAR 0x0C +#define WM_SETTEXT 0x000C +#define HTTOP 12 +#define CF_WAVE 12 +#define HELP_WM_HELP 0x000c +#define DTS_SHORTDATECENTURYFORMAT 0x000C +#define LANG_FRENCH 0x0c +#define SUBLANG_ARABIC_LEBANON 0x0c +#define SUBLANG_ENGLISH_ZIMBABWE 0x0c +#define SUBLANG_SPANISH_ECUADOR 0x0c +#define VK_RETURN 0x0D +#define WM_GETTEXT 0x000D +#define HTTOPLEFT 13 +#define CF_UNICODETEXT 13 +#define HELP_SETPOPUP_POS 0x000d +#define LANG_HEBREW 0x0d +#define SUBLANG_ARABIC_KUWAIT 0x0d +#define SUBLANG_ENGLISH_PHILIPPINES 0x0d +#define SUBLANG_SPANISH_CHILE 0x0d +#define WM_GETTEXTLENGTH 0x000E +#define HTTOPRIGHT 14 +#define CF_ENHMETAFILE 14 +#define LANG_HUNGARIAN 0x0e +#define SUBLANG_ARABIC_UAE 0x0e +#define SUBLANG_SPANISH_URUGUAY 0x0e +#define WM_PAINT 0x000F +#define HTBOTTOM 15 +#define CF_HDROP 15 +#define LANG_ICELANDIC 0x0f +#define SUBLANG_ARABIC_BAHRAIN 0x0f +#define SUBLANG_SPANISH_PARAGUAY 0x0f +#define MAXIMUM_RESERVED_MANIFEST_RESOURCE_ID 16 +#define VK_SHIFT 0x10 +#define WM_CLOSE 0x0010 +#define HTBOTTOMLEFT 16 +#define WVR_ALIGNTOP 0x0010 +#define MK_MBUTTON 0x0010 +#define TME_NONCLIENT 0x00000010 +#define CF_LOCALE 16 +#define HELP_TCARD_DATA 0x0010 +#define TBSTYLE_AUTOSIZE 0x0010 +#define TTS_NOANIMATE 0x10 +#define TBS_NOTICKS 0x0010 +#define UDS_AUTOBUDDY 0x0010 +#define PBS_SMOOTHREVERSE 0x10 +#define LWS_USECUSTOMTEXT 0x0010 +#define LVS_SORTASCENDING 0x0010 +#define TVS_DISABLEDRAGDROP 0x0010 +#define TVS_EX_RICHTOOLTIP 0x0010 +#define TCS_FORCEICONLEFT 0x0010 +#define MCS_NOTODAY 0x0010 +#define DTS_APPCANPARSE 0x0010 +#define NFS_ALL 0x0010 +#define LANG_ITALIAN 0x10 +#define SUBLANG_ARABIC_QATAR 0x10 +#define SUBLANG_ENGLISH_INDIA 0x10 +#define SUBLANG_SPANISH_BOLIVIA 0x10 +#define VK_CONTROL 0x11 +#define WM_QUERYENDSESSION 0x0011 +#define HTBOTTOMRIGHT 17 +#define CF_DIBV5 17 +#define HELP_TCARD_OTHER_CALLER 0x0011 +#define LANG_JAPANESE 0x11 +#define SUBLANG_ENGLISH_MALAYSIA 0x11 +#define SUBLANG_SPANISH_EL_SALVADOR 0x11 +#define VK_MENU 0x12 +#define WM_QUIT 0x0012 +#define HTBORDER 18 +#define CF_MAX 18 +#define LANG_KOREAN 0x12 +#define SUBLANG_ENGLISH_SINGAPORE 0x12 +#define SUBLANG_SPANISH_HONDURAS 0x12 +#define VK_PAUSE 0x13 +#define WM_QUERYOPEN 0x0013 +#define HTOBJECT 19 +#define LANG_DUTCH 0x13 +#define SUBLANG_SPANISH_NICARAGUA 0x13 +#define VK_CAPITAL 0x14 +#define WM_ERASEBKGND 0x0014 +#define HTCLOSE 20 +#define LANG_NORWEGIAN 0x14 +#define SUBLANG_SPANISH_PUERTO_RICO 0x14 +#define VK_KANA 0x15 +#define VK_HANGEUL 0x15 +#define VK_HANGUL 0x15 +#define WM_SYSCOLORCHANGE 0x0015 +#define HTHELP 21 +#define LANG_POLISH 0x15 +#define SUBLANG_SPANISH_US 0x15 +#define WM_ENDSESSION 0x0016 +#define LANG_PORTUGUESE 0x16 +#define VK_JUNJA 0x17 +#define LANG_ROMANSH 0x17 +#define RT_MANIFEST 24 +#define VK_FINAL 0x18 +#define WM_SHOWWINDOW 0x0018 +#define LANG_ROMANIAN 0x18 +#define VK_HANJA 0x19 +#define VK_KANJI 0x19 +#define LANG_RUSSIAN 0x19 +#define WM_WININICHANGE 0x001A +#define LANG_BOSNIAN 0x1a +#define LANG_CROATIAN 0x1a +#define LANG_SERBIAN 0x1a +#define VK_ESCAPE 0x1B +#define WM_DEVMODECHANGE 0x001B +#define LANG_SLOVAK 0x1b +#define VK_CONVERT 0x1C +#define WM_ACTIVATEAPP 0x001C +#define LANG_ALBANIAN 0x1c +#define VK_NONCONVERT 0x1D +#define WM_FONTCHANGE 0x001D +#define LANG_SWEDISH 0x1d +#define VK_ACCEPT 0x1E +#define WM_TIMECHANGE 0x001E +#define LANG_THAI 0x1e +#define VK_MODECHANGE 0x1F +#define WM_CANCELMODE 0x001F +#define LANG_TURKISH 0x1f +#define VK_SPACE 0x20 +#define WM_SETCURSOR 0x0020 +#define SMTO_ERRORONEXIT 0x0020 +#define WVR_ALIGNLEFT 0x0020 +#define MK_XBUTTON1 0x0020 +#define CS_OWNDC 0x0020 +#define TBSTYLE_NOPREFIX 0x0020 +#define TTS_NOFADE 0x20 +#define TBS_ENABLESELRANGE 0x0020 +#define UDS_ARROWKEYS 0x0020 +#define LWS_RIGHT 0x0020 +#define LVS_SORTDESCENDING 0x0020 +#define TVS_SHOWSELALWAYS 0x0020 +#define TVS_EX_AUTOHSCROLL 0x0020 +#define TCS_FORCELABELLEFT 0x0020 +#define DTS_RIGHTALIGN 0x0020 +#define NFS_USEFONTASSOC 0x0020 +#define LANG_URDU 0x20 +#define VK_PRIOR 0x21 +#define WM_MOUSEACTIVATE 0x0021 +#define LANG_INDONESIAN 0x21 +#define VK_NEXT 0x22 +#define WM_CHILDACTIVATE 0x0022 +#define LANG_UKRAINIAN 0x22 +#define VK_END 0x23 +#define WM_QUEUESYNC 0x0023 +#define LANG_BELARUSIAN 0x23 +#define VK_HOME 0x24 +#define WM_GETMINMAXINFO 0x0024 +#define LANG_SLOVENIAN 0x24 +#define VK_LEFT 0x25 +#define LANG_ESTONIAN 0x25 +#define VK_UP 0x26 +#define WM_PAINTICON 0x0026 +#define LANG_LATVIAN 0x26 +#define VK_RIGHT 0x27 +#define WM_ICONERASEBKGND 0x0027 +#define LANG_LITHUANIAN 0x27 +#define VK_DOWN 0x28 +#define WM_NEXTDLGCTL 0x0028 +#define LANG_TAJIK 0x28 +#define VK_SELECT 0x29 +#define LANG_FARSI 0x29 +#define LANG_PERSIAN 0x29 +#define VK_PRINT 0x2A +#define WM_SPOOLERSTATUS 0x002A +#define LANG_VIETNAMESE 0x2a +#define VK_EXECUTE 0x2B +#define WM_DRAWITEM 0x002B +#define LANG_ARMENIAN 0x2b +#define VK_SNAPSHOT 0x2C +#define WM_MEASUREITEM 0x002C +#define LANG_AZERI 0x2c +#define VK_INSERT 0x2D +#define WM_DELETEITEM 0x002D +#define LANG_BASQUE 0x2d +#define VK_DELETE 0x2E +#define WM_VKEYTOITEM 0x002E +#define LANG_LOWER_SORBIAN 0x2e +#define LANG_UPPER_SORBIAN 0x2e +#define VK_HELP 0x2F +#define WM_CHARTOITEM 0x002F +#define LANG_MACEDONIAN 0x2f +#define WM_SETFONT 0x0030 +#define WM_GETFONT 0x0031 +#define WM_SETHOTKEY 0x0032 +#define LANG_TSWANA 0x32 +#define WM_GETHOTKEY 0x0033 +#define LANG_XHOSA 0x34 +#define LANG_ZULU 0x35 +#define LANG_AFRIKAANS 0x36 +#define WM_QUERYDRAGICON 0x0037 +#define LANG_GEORGIAN 0x37 +#define LANG_FAEROESE 0x38 +#define WM_COMPAREITEM 0x0039 +#define LANG_HINDI 0x39 +#define LANG_MALTESE 0x3a +#define LANG_SAMI 0x3b +#define LANG_IRISH 0x3c +#define WM_GETOBJECT 0x003D +#define LANG_MALAY 0x3e +#define LANG_KAZAK 0x3f +#define WVR_ALIGNBOTTOM 0x0040 +#define MK_XBUTTON2 0x0040 +#define CS_CLASSDC 0x0040 +#define HDS_DRAGDROP 0x0040 +#define BTNS_SHOWTEXT 0x0040 +#define TTS_BALLOON 0x40 +#define TBS_FIXEDLENGTH 0x0040 +#define UDS_HORZ 0x0040 +#define LVS_SHAREIMAGELISTS 0x0040 +#define TVS_RTLREADING 0x0040 +#define TVS_EX_FADEINOUTEXPANDOS 0x0040 +#define TCS_HOTTRACK 0x0040 +#define MCS_NOTRAILINGDATES 0x0040 +#define LANG_KYRGYZ 0x40 +#define WM_COMPACTING 0x0041 +#define LANG_SWAHILI 0x41 +#define LANG_TURKMEN 0x42 +#define LANG_UZBEK 0x43 +#define WM_COMMNOTIFY 0x0044 +#define LANG_TATAR 0x44 +#define LANG_BENGALI 0x45 +#define WM_WINDOWPOSCHANGING 0x0046 +#define LANG_PUNJABI 0x46 +#define WM_WINDOWPOSCHANGED 0x0047 +#define LANG_GUJARATI 0x47 +#define WM_POWER 0x0048 +#define LANG_ORIYA 0x48 +#define LANG_TAMIL 0x49 +#define WM_COPYDATA 0x004A +#define LANG_TELUGU 0x4a +#define WM_CANCELJOURNAL 0x004B +#define LANG_KANNADA 0x4b +#define LANG_MALAYALAM 0x4c +#define LANG_ASSAMESE 0x4d +#define WM_NOTIFY 0x004E +#define LANG_MARATHI 0x4e +#define LANG_SANSKRIT 0x4f +#define WM_INPUTLANGCHANGEREQUEST 0x0050 +#define LANG_MONGOLIAN 0x50 +#define WM_INPUTLANGCHANGE 0x0051 +#define LANG_TIBETAN 0x51 +#define WM_TCARD 0x0052 +#define LANG_WELSH 0x52 +#define WM_HELP 0x0053 +#define LANG_KHMER 0x53 +#define WM_USERCHANGED 0x0054 +#define LANG_LAO 0x54 +#define WM_NOTIFYFORMAT 0x0055 +#define LANG_GALICIAN 0x56 +#define LANG_KONKANI 0x57 +#define LANG_MANIPURI 0x58 +#define LANG_SINDHI 0x59 +#define LANG_SYRIAC 0x5a +#define VK_LWIN 0x5B +#define LANG_SINHALESE 0x5b +#define VK_RWIN 0x5C +#define VK_APPS 0x5D +#define LANG_INUKTITUT 0x5d +#define LANG_AMHARIC 0x5e +#define VK_SLEEP 0x5F +#define LANG_TAMAZIGHT 0x5f +#define VK_NUMPAD0 0x60 +#define LANG_KASHMIRI 0x60 +#define VK_NUMPAD1 0x61 +#define LANG_NEPALI 0x61 +#define VK_NUMPAD2 0x62 +#define LANG_FRISIAN 0x62 +#define VK_NUMPAD3 0x63 +#define LANG_PASHTO 0x63 +#define VK_NUMPAD4 0x64 +#define LANG_FILIPINO 0x64 +#define VS_USER_DEFINED 100 +#define VK_NUMPAD5 0x65 +#define LANG_DIVEHI 0x65 +#define VK_NUMPAD6 0x66 +#define VK_NUMPAD7 0x67 +#define VK_NUMPAD8 0x68 +#define LANG_HAUSA 0x68 +#define VK_NUMPAD9 0x69 +#define VK_MULTIPLY 0x6A +#define LANG_YORUBA 0x6a +#define VK_ADD 0x6B +#define LANG_QUECHUA 0x6b +#define VK_SEPARATOR 0x6C +#define LANG_SOTHO 0x6c +#define VK_SUBTRACT 0x6D +#define LANG_BASHKIR 0x6d +#define VK_DECIMAL 0x6E +#define LANG_LUXEMBOURGISH 0x6e +#define VK_DIVIDE 0x6F +#define LANG_GREENLANDIC 0x6f +#define VK_F1 0x70 +#define LANG_IGBO 0x70 +#define VK_F2 0x71 +#define VK_F3 0x72 +#define VK_F4 0x73 +#define LANG_TIGRIGNA 0x73 +#define VK_F5 0x74 +#define VK_F6 0x75 +#define VK_F7 0x76 +#define VK_F8 0x77 +#define VK_F9 0x78 +#define WHEEL_DELTA 120 +#define LANG_YI 0x78 +#define VK_F10 0x79 +#define VK_F11 0x7A +#define LANG_MAPUDUNGUN 0x7a +#define VK_F12 0x7B +#define WM_CONTEXTMENU 0x007B +#define VK_F13 0x7C +#define WM_STYLECHANGING 0x007C +#define LANG_MOHAWK 0x7c +#define VK_F14 0x7D +#define WM_STYLECHANGED 0x007D +#define VK_F15 0x7E +#define WM_DISPLAYCHANGE 0x007E +#define LANG_BRETON 0x7e +#define VK_F16 0x7F +#define WM_GETICON 0x007F +#define LANG_INVARIANT 0x7f +#define VK_F17 0x80 +#define WM_SETICON 0x0080 +#define WVR_ALIGNRIGHT 0x0080 +#define CS_PARENTDC 0x0080 +#define CF_OWNERDISPLAY 0x0080 +#define HDS_FULLDRAG 0x0080 +#define BTNS_WHOLEDROPDOWN 0x0080 +#define TTS_CLOSE 0x80 +#define TBS_NOTHUMB 0x0080 +#define UDS_NOTHOUSANDS 0x0080 +#define LVS_NOLABELWRAP 0x0080 +#define TVS_NOTOOLTIPS 0x0080 +#define TVS_EX_PARTIALCHECKBOXES 0x0080 +#define TCS_VERTICAL 0x0080 +#define MCS_SHORTDAYSOFWEEK 0x0080 +#define LANG_UIGHUR 0x80 +#define VK_F18 0x81 +#define WM_NCCREATE 0x0081 +#define CF_DSPTEXT 0x0081 +#define LANG_MAORI 0x81 +#define VK_F19 0x82 +#define WM_NCDESTROY 0x0082 +#define CF_DSPBITMAP 0x0082 +#define LANG_OCCITAN 0x82 +#define VK_F20 0x83 +#define WM_NCCALCSIZE 0x0083 +#define CF_DSPMETAFILEPICT 0x0083 +#define LANG_CORSICAN 0x83 +#define VK_F21 0x84 +#define WM_NCHITTEST 0x0084 +#define LANG_ALSATIAN 0x84 +#define VK_F22 0x85 +#define WM_NCPAINT 0x0085 +#define LANG_YAKUT 0x85 +#define VK_F23 0x86 +#define WM_NCACTIVATE 0x0086 +#define LANG_KICHE 0x86 +#define VK_F24 0x87 +#define WM_GETDLGCODE 0x0087 +#define LANG_KINYARWANDA 0x87 +#define WM_SYNCPAINT 0x0088 +#define LANG_WOLOF 0x88 +#define LANG_DARI 0x8c +#define CF_DSPENHMETAFILE 0x008E +#define VK_NUMLOCK 0x90 +#define VK_SCROLL 0x91 +#define VK_OEM_NEC_EQUAL 0x92 +#define VK_OEM_FJ_JISHO 0x92 +#define VK_OEM_FJ_MASSHOU 0x93 +#define VK_OEM_FJ_TOUROKU 0x94 +#define VK_OEM_FJ_LOYA 0x95 +#define VK_OEM_FJ_ROYA 0x96 +#define VK_LSHIFT 0xA0 +#define WM_NCMOUSEMOVE 0x00A0 +#define VK_RSHIFT 0xA1 +#define WM_NCLBUTTONDOWN 0x00A1 +#define VK_LCONTROL 0xA2 +#define WM_NCLBUTTONUP 0x00A2 +#define VK_RCONTROL 0xA3 +#define WM_NCLBUTTONDBLCLK 0x00A3 +#define VK_LMENU 0xA4 +#define WM_NCRBUTTONDOWN 0x00A4 +#define VK_RMENU 0xA5 +#define WM_NCRBUTTONUP 0x00A5 +#define VK_BROWSER_BACK 0xA6 +#define WM_NCRBUTTONDBLCLK 0x00A6 +#define VK_BROWSER_FORWARD 0xA7 +#define WM_NCMBUTTONDOWN 0x00A7 +#define VK_BROWSER_REFRESH 0xA8 +#define WM_NCMBUTTONUP 0x00A8 +#define VK_BROWSER_STOP 0xA9 +#define WM_NCMBUTTONDBLCLK 0x00A9 +#define VK_BROWSER_SEARCH 0xAA +#define VK_BROWSER_FAVORITES 0xAB +#define WM_NCXBUTTONDOWN 0x00AB +#define VK_BROWSER_HOME 0xAC +#define WM_NCXBUTTONUP 0x00AC +#define VK_VOLUME_MUTE 0xAD +#define WM_NCXBUTTONDBLCLK 0x00AD +#define VK_VOLUME_DOWN 0xAE +#define VK_VOLUME_UP 0xAF +#define VK_MEDIA_NEXT_TRACK 0xB0 +#define EM_GETSEL 0x00B0 +#define VK_MEDIA_PREV_TRACK 0xB1 +#define EM_SETSEL 0x00B1 +#define VK_MEDIA_STOP 0xB2 +#define EM_GETRECT 0x00B2 +#define VK_MEDIA_PLAY_PAUSE 0xB3 +#define EM_SETRECT 0x00B3 +#define VK_LAUNCH_MAIL 0xB4 +#define EM_SETRECTNP 0x00B4 +#define VK_LAUNCH_MEDIA_SELECT 0xB5 +#define EM_SCROLL 0x00B5 +#define VK_LAUNCH_APP1 0xB6 +#define EM_LINESCROLL 0x00B6 +#define VK_LAUNCH_APP2 0xB7 +#define EM_SCROLLCARET 0x00B7 +#define EM_GETMODIFY 0x00B8 +#define EM_SETMODIFY 0x00B9 +#define VK_OEM_1 0xBA +#define EM_GETLINECOUNT 0x00BA +#define VK_OEM_PLUS 0xBB +#define EM_LINEINDEX 0x00BB +#define VK_OEM_COMMA 0xBC +#define EM_SETHANDLE 0x00BC +#define VK_OEM_MINUS 0xBD +#define EM_GETHANDLE 0x00BD +#define VK_OEM_PERIOD 0xBE +#define EM_GETTHUMB 0x00BE +#define VK_OEM_2 0xBF +#define VK_OEM_3 0xC0 +#define EM_LINELENGTH 0x00C1 +#define EM_REPLACESEL 0x00C2 +#define EM_GETLINE 0x00C4 +#define EM_LIMITTEXT 0x00C5 +#define EM_CANUNDO 0x00C6 +#define EM_UNDO 0x00C7 +#define EM_FMTLINES 0x00C8 +#define EM_LINEFROMCHAR 0x00C9 +#define EM_SETTABSTOPS 0x00CB +#define EM_SETPASSWORDCHAR 0x00CC +#define EM_EMPTYUNDOBUFFER 0x00CD +#define EM_GETFIRSTVISIBLELINE 0x00CE +#define EM_SETREADONLY 0x00CF +#define EM_SETWORDBREAKPROC 0x00D0 +#define EM_GETWORDBREAKPROC 0x00D1 +#define EM_GETPASSWORDCHAR 0x00D2 +#define EM_SETMARGINS 0x00D3 +#define EM_GETMARGINS 0x00D4 +#define EM_GETLIMITTEXT 0x00D5 +#define EM_POSFROMCHAR 0x00D6 +#define EM_CHARFROMPOS 0x00D7 +#define EM_SETIMESTATUS 0x00D8 +#define EM_GETIMESTATUS 0x00D9 +#define VK_OEM_4 0xDB +#define VK_OEM_5 0xDC +#define VK_OEM_6 0xDD +#define VK_OEM_7 0xDE +#define VK_OEM_8 0xDF +#define VK_OEM_AX 0xE1 +#define VK_OEM_102 0xE2 +#define VK_ICO_HELP 0xE3 +#define VK_ICO_00 0xE4 +#define VK_PROCESSKEY 0xE5 +#define VK_ICO_CLEAR 0xE6 +#define VK_PACKET 0xE7 +#define VK_OEM_RESET 0xE9 +#define VK_OEM_JUMP 0xEA +#define VK_OEM_PA1 0xEB +#define VK_OEM_PA2 0xEC +#define VK_OEM_PA3 0xED +#define VK_OEM_WSCTRL 0xEE +#define VK_OEM_CUSEL 0xEF +#define VK_OEM_ATTN 0xF0 +#define BM_GETCHECK 0x00F0 +#define VK_OEM_FINISH 0xF1 +#define BM_SETCHECK 0x00F1 +#define VK_OEM_COPY 0xF2 +#define BM_GETSTATE 0x00F2 +#define VK_OEM_AUTO 0xF3 +#define BM_SETSTATE 0x00F3 +#define VK_OEM_ENLW 0xF4 +#define BM_SETSTYLE 0x00F4 +#define VK_OEM_BACKTAB 0xF5 +#define BM_CLICK 0x00F5 +#define VK_ATTN 0xF6 +#define BM_GETIMAGE 0x00F6 +#define VK_CRSEL 0xF7 +#define BM_SETIMAGE 0x00F7 +#define VK_EXSEL 0xF8 +#define BM_SETDONTCLICK 0x00F8 +#define VK_EREOF 0xF9 +#define VK_PLAY 0xFA +#define VK_ZOOM 0xFB +#define VK_NONAME 0xFC +#define VK_PA1 0xFD +#define VK_OEM_CLEAR 0xFE +#define WM_INPUT_DEVICE_CHANGE 0x00FE +#define SUBVERSION_MASK 0x000000FF +#define WM_INPUT 0x00FF +#define WM_KEYFIRST 0x0100 +#define WM_KEYDOWN 0x0100 +#define WVR_HREDRAW 0x0100 +#define HDS_FILTERBAR 0x0100 +#define TBSTYLE_TOOLTIPS 0x0100 +#define RBS_TOOLTIPS 0x00000100 +#define TTS_USEVISUALSTYLE 0x100 +#define SBARS_SIZEGRIP 0x0100 +#define TBS_TOOLTIPS 0x0100 +#define UDS_HOTTRACK 0x0100 +#define LVS_AUTOARRANGE 0x0100 +#define TVS_CHECKBOXES 0x0100 +#define TVS_EX_EXCLUSIONCHECKBOXES 0x0100 +#define TCS_BUTTONS 0x0100 +#define MCS_NOSELCHANGEONNAV 0x0100 +#define WM_KEYUP 0x0101 +#define WM_CHAR 0x0102 +#define WM_DEADCHAR 0x0103 +#define WM_SYSKEYDOWN 0x0104 +#define WM_SYSKEYUP 0x0105 +#define WM_SYSCHAR 0x0106 +#define WM_SYSDEADCHAR 0x0107 +#define WM_UNICHAR 0x0109 +#define WM_KEYLAST 0x0109 +#define WM_IME_STARTCOMPOSITION 0x010D +#define WM_IME_ENDCOMPOSITION 0x010E +#define WM_IME_COMPOSITION 0x010F +#define WM_IME_KEYLAST 0x010F +#define WM_INITDIALOG 0x0110 +#define WM_COMMAND 0x0111 +#define WM_SYSCOMMAND 0x0112 +#define WM_TIMER 0x0113 +#define WM_HSCROLL 0x0114 +#define WM_VSCROLL 0x0115 +#define WM_INITMENU 0x0116 +#define WM_INITMENUPOPUP 0x0117 +#define WM_MENUSELECT 0x011F +#define WM_MENUCHAR 0x0120 +#define WM_ENTERIDLE 0x0121 +#define WM_MENURBUTTONUP 0x0122 +#define WM_MENUDRAG 0x0123 +#define WM_MENUGETOBJECT 0x0124 +#define WM_UNINITMENUPOPUP 0x0125 +#define WM_MENUCOMMAND 0x0126 +#define WM_CHANGEUISTATE 0x0127 +#define WM_UPDATEUISTATE 0x0128 +#define WM_QUERYUISTATE 0x0129 +#define WM_CTLCOLORMSGBOX 0x0132 +#define WM_CTLCOLOREDIT 0x0133 +#define WM_CTLCOLORLISTBOX 0x0134 +#define WM_CTLCOLORBTN 0x0135 +#define WM_CTLCOLORDLG 0x0136 +#define WM_CTLCOLORSCROLLBAR 0x0137 +#define WM_CTLCOLORSTATIC 0x0138 +#define MN_GETHMENU 0x01E1 +#define _WIN32_IE_IE20 0x0200 +#define WM_MOUSEFIRST 0x0200 +#define WM_MOUSEMOVE 0x0200 +#define WVR_VREDRAW 0x0200 +#define CS_NOCLOSE 0x0200 +#define CF_PRIVATEFIRST 0x0200 +#define HDS_FLAT 0x0200 +#define TBSTYLE_WRAPABLE 0x0200 +#define RBS_VARHEIGHT 0x00000200 +#define TBS_REVERSED 0x0200 +#define LVS_EDITLABELS 0x0200 +#define TVS_TRACKSELECT 0x0200 +#define TVS_EX_DIMMEDCHECKBOXES 0x0200 +#define TCS_MULTILINE 0x0200 +#define WM_LBUTTONDOWN 0x0201 +#define WM_LBUTTONUP 0x0202 +#define WM_LBUTTONDBLCLK 0x0203 +#define WM_RBUTTONDOWN 0x0204 +#define WM_RBUTTONUP 0x0205 +#define WM_RBUTTONDBLCLK 0x0206 +#define WM_MBUTTONDOWN 0x0207 +#define WM_MBUTTONUP 0x0208 +#define WM_MBUTTONDBLCLK 0x0209 +#define WM_MOUSEWHEEL 0x020A +#define WM_XBUTTONDOWN 0x020B +#define WM_XBUTTONUP 0x020C +#define WM_XBUTTONDBLCLK 0x020D +#define WM_MOUSEHWHEEL 0x020E +#define WM_MOUSELAST 0x020E +#define WM_PARENTNOTIFY 0x0210 +#define WM_ENTERMENULOOP 0x0211 +#define WM_EXITMENULOOP 0x0212 +#define WM_NEXTMENU 0x0213 +#define WM_SIZING 0x0214 +#define WM_CAPTURECHANGED 0x0215 +#define WM_MOVING 0x0216 +#define WM_POWERBROADCAST 0x0218 +#define WM_DEVICECHANGE 0x0219 +#define WM_MDICREATE 0x0220 +#define WM_MDIDESTROY 0x0221 +#define WM_MDIACTIVATE 0x0222 +#define WM_MDIRESTORE 0x0223 +#define WM_MDINEXT 0x0224 +#define WM_MDIMAXIMIZE 0x0225 +#define WM_MDITILE 0x0226 +#define WM_MDICASCADE 0x0227 +#define WM_MDIICONARRANGE 0x0228 +#define WM_MDIGETACTIVE 0x0229 +#define WM_MDISETMENU 0x0230 +#define WM_ENTERSIZEMOVE 0x0231 +#define WM_EXITSIZEMOVE 0x0232 +#define WM_DROPFILES 0x0233 +#define WM_MDIREFRESHMENU 0x0234 +#define WM_IME_SETCONTEXT 0x0281 +#define WM_IME_NOTIFY 0x0282 +#define WM_IME_CONTROL 0x0283 +#define WM_IME_COMPOSITIONFULL 0x0284 +#define WM_IME_SELECT 0x0285 +#define WM_IME_CHAR 0x0286 +#define WM_IME_REQUEST 0x0288 +#define WM_IME_KEYDOWN 0x0290 +#define WM_IME_KEYUP 0x0291 +#define WM_NCMOUSEHOVER 0x02A0 +#define WM_MOUSEHOVER 0x02A1 +#define WM_NCMOUSELEAVE 0x02A2 +#define WM_MOUSELEAVE 0x02A3 +#define WM_WTSSESSION_CHANGE 0x02B1 +#define WM_TABLET_FIRST 0x02c0 +#define WM_TABLET_LAST 0x02df +#define CF_PRIVATELAST 0x02FF +#define _WIN32_IE_IE30 0x0300 +#define WM_CUT 0x0300 +#define CF_GDIOBJFIRST 0x0300 +#define WM_COPY 0x0301 +#define _WIN32_IE_IE302 0x0302 +#define WM_PASTE 0x0302 +#define WM_CLEAR 0x0303 +#define WM_UNDO 0x0304 +#define WM_RENDERFORMAT 0x0305 +#define WM_RENDERALLFORMATS 0x0306 +#define WM_DESTROYCLIPBOARD 0x0307 +#define WM_DRAWCLIPBOARD 0x0308 +#define WM_PAINTCLIPBOARD 0x0309 +#define WM_VSCROLLCLIPBOARD 0x030A +#define WM_SIZECLIPBOARD 0x030B +#define WM_ASKCBFORMATNAME 0x030C +#define WM_CHANGECBCHAIN 0x030D +#define WM_HSCROLLCLIPBOARD 0x030E +#define WM_QUERYNEWPALETTE 0x030F +#define WM_PALETTEISCHANGING 0x0310 +#define WM_PALETTECHANGED 0x0311 +#define WM_HOTKEY 0x0312 +#define WM_PRINT 0x0317 +#define WM_PRINTCLIENT 0x0318 +#define WM_APPCOMMAND 0x0319 +#define WM_THEMECHANGED 0x031A +#define WM_CLIPBOARDUPDATE 0x031D +#define WM_DWMCOMPOSITIONCHANGED 0x031E +#define WM_DWMNCRENDERINGCHANGED 0x031F +#define WM_DWMCOLORIZATIONCOLORCHANGED 0x0320 +#define WM_DWMWINDOWMAXIMIZEDCHANGE 0x0321 +#define WM_GETTITLEBARINFOEX 0x033F +#define WM_HANDHELDFIRST 0x0358 +#define WM_HANDHELDLAST 0x035F +#define WM_AFXFIRST 0x0360 +#define WM_AFXLAST 0x037F +#define WM_PENWINFIRST 0x0380 +#define WM_PENWINLAST 0x038F +#define WM_DDE_FIRST 0x03E0 +#define CF_GDIOBJLAST 0x03FF +#define _WIN32_WINNT_NT4 0x0400 +#define _WIN32_IE_IE40 0x0400 +#define WM_USER 0x0400 +#define WVR_VALIDRECTS 0x0400 +#define HDS_CHECKBOXES 0x0400 +#define TBSTYLE_ALTDRAG 0x0400 +#define RBS_BANDBORDERS 0x00000400 +#define TBS_DOWNISLEFT 0x0400 +#define LVS_OWNERDRAWFIXED 0x0400 +#define TVS_SINGLEEXPAND 0x0400 +#define TVS_EX_DRAWIMAGEASYNC 0x0400 +#define TCS_FIXEDWIDTH 0x0400 +#define ctlFirst 0x0400 +#define psh1 0x0400 +#define _WIN32_IE_IE401 0x0401 +#define psh2 0x0401 +#define psh3 0x0402 +#define psh4 0x0403 +#define psh5 0x0404 +#define psh6 0x0405 +#define psh7 0x0406 +#define psh8 0x0407 +#define psh9 0x0408 +#define psh10 0x0409 +#define psh11 0x040a +#define psh12 0x040b +#define psh13 0x040c +#define psh14 0x040d +#define psh15 0x040e +#define psh16 0x040f +#define _WIN32_WINDOWS 0x0410 +#define chx1 0x0410 +#define chx2 0x0411 +#define chx3 0x0412 +#define chx4 0x0413 +#define chx5 0x0414 +#define chx6 0x0415 +#define chx7 0x0416 +#define chx8 0x0417 +#define chx9 0x0418 +#define chx10 0x0419 +#define chx11 0x041a +#define chx12 0x041b +#define chx13 0x041c +#define chx14 0x041d +#define chx15 0x041e +#define chx16 0x041f +#define rad1 0x0420 +#define rad2 0x0421 +#define rad3 0x0422 +#define rad4 0x0423 +#define rad5 0x0424 +#define rad6 0x0425 +#define rad7 0x0426 +#define rad8 0x0427 +#define rad9 0x0428 +#define rad10 0x0429 +#define rad11 0x042a +#define rad12 0x042b +#define rad13 0x042c +#define rad14 0x042d +#define rad15 0x042e +#define rad16 0x042f +#define grp1 0x0430 +#define grp2 0x0431 +#define grp3 0x0432 +#define grp4 0x0433 +#define frm1 0x0434 +#define frm2 0x0435 +#define frm3 0x0436 +#define frm4 0x0437 +#define rct1 0x0438 +#define rct2 0x0439 +#define rct3 0x043a +#define rct4 0x043b +#define ico1 0x043c +#define ico2 0x043d +#define ico3 0x043e +#define ico4 0x043f +#define stc1 0x0440 +#define stc2 0x0441 +#define stc3 0x0442 +#define stc4 0x0443 +#define stc5 0x0444 +#define stc6 0x0445 +#define stc7 0x0446 +#define stc8 0x0447 +#define stc9 0x0448 +#define stc10 0x0449 +#define stc11 0x044a +#define stc12 0x044b +#define stc13 0x044c +#define stc14 0x044d +#define stc15 0x044e +#define stc16 0x044f +#define stc17 0x0450 +#define stc18 0x0451 +#define stc19 0x0452 +#define stc20 0x0453 +#define stc21 0x0454 +#define stc22 0x0455 +#define stc23 0x0456 +#define stc24 0x0457 +#define stc25 0x0458 +#define stc26 0x0459 +#define stc27 0x045a +#define stc28 0x045b +#define stc29 0x045c +#define stc30 0x045d +#define stc31 0x045e +#define stc32 0x045f +#define lst1 0x0460 +#define lst2 0x0461 +#define lst3 0x0462 +#define lst4 0x0463 +#define lst5 0x0464 +#define lst6 0x0465 +#define lst7 0x0466 +#define lst8 0x0467 +#define lst9 0x0468 +#define lst10 0x0469 +#define lst11 0x046a +#define lst12 0x046b +#define lst13 0x046c +#define lst14 0x046d +#define lst15 0x046e +#define lst16 0x046f +#define cmb1 0x0470 +#define cmb2 0x0471 +#define cmb3 0x0472 +#define cmb4 0x0473 +#define cmb5 0x0474 +#define cmb6 0x0475 +#define cmb7 0x0476 +#define cmb8 0x0477 +#define cmb9 0x0478 +#define cmb10 0x0479 +#define cmb11 0x047a +#define cmb12 0x047b +#define cmb13 0x047c +#define cmb14 0x047d +#define cmb15 0x047e +#define cmb16 0x047f +#define edt1 0x0480 +#define edt2 0x0481 +#define edt3 0x0482 +#define edt4 0x0483 +#define edt5 0x0484 +#define edt6 0x0485 +#define edt7 0x0486 +#define edt8 0x0487 +#define edt9 0x0488 +#define edt10 0x0489 +#define edt11 0x048a +#define edt12 0x048b +#define edt13 0x048c +#define edt14 0x048d +#define edt15 0x048e +#define edt16 0x048f +#define scr1 0x0490 +#define scr2 0x0491 +#define scr3 0x0492 +#define scr4 0x0493 +#define scr5 0x0494 +#define scr6 0x0495 +#define scr7 0x0496 +#define scr8 0x0497 +#define ctl1 0x04A0 +#define ctlLast 0x04ff +#define _WIN32_WINNT_WIN2K 0x0500 +#define _WIN32_IE_IE50 0x0500 +#define _WIN32_WINNT_WINXP 0x0501 +#define _WIN32_IE_IE501 0x0501 +#define _WIN32_WINNT_WS03 0x0502 +#define _WIN32_IE_IE55 0x0550 +#define _WIN32_WINNT_LONGHORN 0x0600 +#define _WIN32_IE_IE60 0x0600 +#define _WIN32_WINNT 0x0600 +#define FILEOPENORD 1536 +#define VER_PRODUCTVERSION_W 0x0600 +#define _WIN32_IE_IE60SP1 0x0601 +#define MULTIFILEOPENORD 1537 +#define _WIN32_IE_WS03 0x0602 +#define PRINTDLGORD 1538 +#define _WIN32_IE_IE60SP2 0x0603 +#define PRNSETUPDLGORD 1539 +#define FINDDLGORD 1540 +#define REPLACEDLGORD 1541 +#define FONTDLGORD 1542 +#define FORMATDLGORD31 1543 +#define FORMATDLGORD30 1544 +#define RUNDLGORD 1545 +#define PAGESETUPDLGORD 1546 +#define NEWFILEOPENORD 1547 +#define PRINTDLGEXORD 1549 +#define PAGESETUPDLGORDMOTIF 1550 +#define COLORMGMTDLGORD 1551 +#define NEWFILEOPENV2ORD 1552 +#define NEWFILEOPENV3ORD 1553 +#define _WIN32_IE_IE70 0x0700 +#define _WIN32_IE 0x0700 +#define CS_SAVEBITS 0x0800 +#define HDS_NOSIZING 0x0800 +#define TBSTYLE_FLAT 0x0800 +#define RBS_FIXEDORDER 0x00000800 +#define SBARS_TOOLTIPS 0x0800 +#define SBT_TOOLTIPS 0x0800 +#define TBS_NOTIFYBEFOREMOVE 0x0800 +#define LVS_ALIGNLEFT 0x0800 +#define TVS_INFOTIP 0x0800 +#define TCS_RAGGEDRIGHT 0x0800 +#define LVS_ALIGNMASK 0x0c00 +#define CS_BYTEALIGNCLIENT 0x1000 +#define HDS_OVERFLOW 0x1000 +#define TBSTYLE_LIST 0x1000 +#define RBS_REGISTERDROP 0x00001000 +#define TBS_TRANSPARENTBKGND 0x1000 +#define LVS_OWNERDATA 0x1000 +#define TVS_FULLROWSELECT 0x1000 +#define TCS_FOCUSONBUTTONDOWN 0x1000 +#define VER_PRODUCTBUILD 6000 +#define CS_BYTEALIGNWINDOW 0x2000 +#define TBSTYLE_CUSTOMERASE 0x2000 +#define RBS_AUTOSIZE 0x00002000 +#define LVS_NOSCROLL 0x2000 +#define TVS_NOSCROLL 0x2000 +#define TCS_OWNERDRAWFIXED 0x2000 +#define CS_GLOBALCLASS 0x4000 +#define TBSTYLE_REGISTERDROP 0x4000 +#define RBS_VERTICALGRIPPER 0x00004000 +#define LVS_NOCOLUMNHEADER 0x4000 +#define TVS_NONEVENHEIGHT 0x4000 +#define TCS_TOOLTIPS 0x4000 +#define VER_PRODUCTBUILD_QFE 16384 +#define IDH_NO_HELP 28440 +#define IDH_MISSING_CONTEXT 28441 +#define IDH_GENERIC_HELP_BUTTON 28442 +#define IDH_OK 28443 +#define IDH_CANCEL 28444 +#define IDH_HELP 28445 +#define LANG_BOSNIAN_NEUTRAL 0x781a +#define LANG_CHINESE_TRADITIONAL 0x7c04 +#define LANG_SERBIAN_NEUTRAL 0x7c1a +#define IDTIMEOUT 32000 +#define OCR_NORMAL 32512 +#define OIC_SAMPLE 32512 +#define IDI_APPLICATION 32512 +#define OCR_IBEAM 32513 +#define OIC_HAND 32513 +#define IDI_HAND 32513 +#define OCR_WAIT 32514 +#define OIC_QUES 32514 +#define IDI_QUESTION 32514 +#define OCR_CROSS 32515 +#define OIC_BANG 32515 +#define IDI_EXCLAMATION 32515 +#define OCR_UP 32516 +#define OIC_NOTE 32516 +#define IDI_ASTERISK 32516 +#define OIC_WINLOGO 32517 +#define IDI_WINLOGO 32517 +#define OIC_SHIELD 32518 +#define IDI_SHIELD 32518 +#define OCR_SIZE 32640 +#define OCR_ICON 32641 +#define OCR_SIZENWSE 32642 +#define OCR_SIZENESW 32643 +#define OCR_SIZEWE 32644 +#define OCR_SIZENS 32645 +#define OCR_SIZEALL 32646 +#define OCR_ICOCUR 32647 +#define OCR_NO 32648 +#define OCR_HAND 32649 +#define OCR_APPSTARTING 32650 +#define OBM_LFARROWI 32734 +#define OBM_RGARROWI 32735 +#define OBM_DNARROWI 32736 +#define OBM_UPARROWI 32737 +#define OBM_COMBO 32738 +#define OBM_MNARROW 32739 +#define OBM_LFARROWD 32740 +#define OBM_RGARROWD 32741 +#define OBM_DNARROWD 32742 +#define OBM_UPARROWD 32743 +#define OBM_RESTORED 32744 +#define OBM_ZOOMD 32745 +#define OBM_REDUCED 32746 +#define OBM_RESTORE 32747 +#define OBM_ZOOM 32748 +#define OBM_REDUCE 32749 +#define OBM_LFARROW 32750 +#define OBM_RGARROW 32751 +#define OBM_DNARROW 32752 +#define OBM_UPARROW 32753 +#define OBM_CLOSE 32754 +#define OBM_OLD_RESTORE 32755 +#define OBM_OLD_ZOOM 32756 +#define OBM_OLD_REDUCE 32757 +#define OBM_BTNCORNERS 32758 +#define OBM_CHECKBOXES 32759 +#define OBM_CHECK 32760 +#define OBM_BTSIZE 32761 +#define OBM_OLD_LFARROW 32762 +#define OBM_OLD_RGARROW 32763 +#define OBM_OLD_DNARROW 32764 +#define OBM_OLD_UPARROW 32765 +#define OBM_SIZE 32766 +#define OBM_OLD_CLOSE 32767 +#define WM_APP 0x8000 +#define HELP_TCARD 0x8000 +#define TBSTYLE_TRANSPARENT 0x8000 +#define RBS_DBLCLKTOGGLE 0x00008000 +#define LVS_NOSORTHEADER 0x8000 +#define TVS_NOHSCROLL 0x8000 +#define TCS_FOCUSNEVER 0x8000 +#define SC_SIZE 0xF000 +#define SC_SEPARATOR 0xF00F +#define SC_MOVE 0xF010 +#define SC_MINIMIZE 0xF020 +#define SC_MAXIMIZE 0xF030 +#define SC_NEXTWINDOW 0xF040 +#define SC_PREVWINDOW 0xF050 +#define SC_CLOSE 0xF060 +#define SC_VSCROLL 0xF070 +#define SC_HSCROLL 0xF080 +#define SC_MOUSEMENU 0xF090 +#define SC_KEYMENU 0xF100 +#define SC_ARRANGE 0xF110 +#define SC_RESTORE 0xF120 +#define SC_TASKLIST 0xF130 +#define SC_SCREENSAVE 0xF140 +#define SC_HOTKEY 0xF150 +#define SC_DEFAULT 0xF160 +#define SC_MONITORPOWER 0xF170 +#define SC_CONTEXTHELP 0xF180 +#define LVS_TYPESTYLEMASK 0xfc00 +#define SPVERSION_MASK 0x0000FF00 +#define HTERROR -2 +#define PWR_FAIL -1 +#define UNICODE_NOCHAR 0xFFFF +#define HTTRANSPARENT -1 + +// Next default values for new objects +// +#ifdef APSTUDIO_INVOKED +#ifndef APSTUDIO_READONLY_SYMBOLS +#define _APS_NEXT_RESOURCE_VALUE 101 +#define _APS_NEXT_COMMAND_VALUE 40001 +#define _APS_NEXT_CONTROL_VALUE 1000 +#define _APS_NEXT_SYMED_VALUE 101 +#endif +#endif diff --git a/virtualsmartcard/win32/BixVReader/sectionLocker.cpp b/virtualsmartcard/win32/BixVReader/sectionLocker.cpp new file mode 100644 index 0000000..f2beace --- /dev/null +++ b/virtualsmartcard/win32/BixVReader/sectionLocker.cpp @@ -0,0 +1,47 @@ +#include "sectionLocker.h" +void *ShowMe=NULL; +SectionLocker::SectionLocker(CRITICAL_SECTION &critsection,char *function,int line,void* object) { + critsection; + this->section=&critsection; + Function=function; + Line=line; + Object=object; + DWORD start=GetTickCount(); + if (TryEnterCriticalSection(section)==0) { + OutputDebugStringA("[BixVReader]RACE!"); + char logBuffer[500]; + sprintf(logBuffer,"[BixVReader]Richiesto da:Function:%s,Line:%i,Object:%x,Lock:%x",Function,Line,Object,section); + OutputDebugStringA(logBuffer); + ShowMe=section; + EnterCriticalSection(section); + DWORD end=GetTickCount(); + sprintf(logBuffer,"[BixVReader]Elapsed:%i ms",end-start); + OutputDebugStringA(logBuffer); + } +} + +SectionLocker::~SectionLocker() { + if (section==ShowMe) { + char logBuffer[500]; + sprintf(logBuffer,"[BixVReader]Posseduto da:Function:%s,Line:%i,Object:%x,Lock:%x",Function,Line,Object,section); + OutputDebugStringA(logBuffer); + ShowMe=NULL; + } + LeaveCriticalSection(section); +} + +SectionLogger::SectionLogger(char *section) { + section; + start=GetTickCount(); + char logBuffer[500]; + SectionName=section; + sprintf(logBuffer,"[BixVReader]Start section:%s",SectionName); + OutputDebugStringA(logBuffer); +} +SectionLogger::~SectionLogger() { + DWORD end=GetTickCount(); + char logBuffer[500]; + sprintf(logBuffer,"[BixVReader]End section:%s elapsed:%i",SectionName,end-start); + OutputDebugStringA(logBuffer); +} + diff --git a/virtualsmartcard/win32/BixVReader/sectionLocker.h b/virtualsmartcard/win32/BixVReader/sectionLocker.h new file mode 100644 index 0000000..24d08f4 --- /dev/null +++ b/virtualsmartcard/win32/BixVReader/sectionLocker.h @@ -0,0 +1,24 @@ +#pragma once +#include "internal.h" + +class SectionLocker { + char *Function; + int Line; + void *Object; +public: + CRITICAL_SECTION *section; + + SectionLocker(CRITICAL_SECTION &critsection,char *function,int line,void* object); + //SectionLocker(CRITICAL_SECTION §ion); + ~SectionLocker(); +}; + +class SectionLogger { + DWORD start; + char *SectionName; + public: + SectionLogger(char *section); + ~SectionLogger(); +}; + +#define lock(x) lockObj(x,__FUNCTION__,__LINE__,NULL) \ No newline at end of file diff --git a/virtualsmartcard/win32/vpcd/device.cpp b/virtualsmartcard/win32/vpcd/device.cpp deleted file mode 100644 index 20444f2..0000000 --- a/virtualsmartcard/win32/vpcd/device.cpp +++ /dev/null @@ -1,432 +0,0 @@ -#include "vpcd.h" -#include "internal.h" -#include "VirtualSCReader.h" -#include "queue.h" -#include "device.h" -#include "driver.h" -#include -#include -#include "memory.h" -#include - -HRESULT -CMyDevice::CreateInstance( - __in IWDFDriver *FxDriver, - __in IWDFDeviceInitialize * FxDeviceInit - ) -/*++ - - Routine Description: - - This method creates and initializs an instance of the virtual smart card reader driver's - device callback object. - - Arguments: - - FxDeviceInit - the settings for the device. - - Device - a location to store the referenced pointer to the device object. - - Return Value: - - Status - ---*/ -{ - inFunc; - CComObject* device = NULL; - HRESULT hr; - - // - // Allocate a new instance of the device class. - // - hr = CComObject::CreateInstance(&device); - - if (device==NULL) - { - return E_OUTOFMEMORY; - } - - // - // Initialize the instance. - // - device->AddRef(); - FxDeviceInit->SetLockingConstraint(WdfDeviceLevel); - - CComPtr spCallback; - hr = device->QueryInterface(IID_IUnknown, (void**)&spCallback); - - CComPtr spIWDFDevice; - if (SUCCEEDED(hr)) - { - hr = FxDriver->CreateDevice(FxDeviceInit, spCallback, &spIWDFDevice); - } - - if (spIWDFDevice->CreateDeviceInterface(&SmartCardReaderGuid,NULL)!=0) - OutputDebugString(L"CreateDeviceInterface Failed\n"); - - SAFE_RELEASE(device); - - return hr; -} - -void CMyDevice::IoSmartCardIsPresent(IWDFIoRequest* pRequest,SIZE_T inBufSize,SIZE_T outBufSize) { - UNREFERENCED_PARAMETER(inBufSize); - UNREFERENCED_PARAMETER(outBufSize); - inFunc; - if (vicc_present(ctx) == 1) - // there's a smart card present, so complete the request - pRequest->CompleteWithInformation(STATUS_SUCCESS, 0); - else { - // there's no smart card present, so leave the request pending; it will be completed later - waitInsertIpr=pRequest; - IRequestCallbackCancel *callback; - QueryInterface(__uuidof(IRequestCallbackCancel),(void**)&callback); - pRequest->MarkCancelable(callback); - callback->Release(); - } -} - -void CMyDevice::IoSmartCardGetState(IWDFIoRequest* pRequest,SIZE_T inBufSize,SIZE_T outBufSize) { - UNREFERENCED_PARAMETER(inBufSize); - UNREFERENCED_PARAMETER(outBufSize); - inFunc; - if (vicc_present(ctx) == 1) { - OutputDebugString(L"[GSTA]SCARD_SPECIFIC\n"); - completeWithInteger(pRequest, SCARD_SPECIFIC); - } else { - OutputDebugString(L"SCARD_ABSENT\n"); - completeWithInteger(pRequest, SCARD_ABSENT); - } -} -void CMyDevice::IoSmartCardIsAbsent(IWDFIoRequest* pRequest,SIZE_T inBufSize,SIZE_T outBufSize) { - UNREFERENCED_PARAMETER(inBufSize); - UNREFERENCED_PARAMETER(outBufSize); - inFunc; - if (vicc_present(ctx) == 0) - // there's no smart card present, so complete the request - pRequest->CompleteWithInformation(STATUS_SUCCESS, 0); - else { - // there's a smart card present, so leave the request pending; it will be completed later - waitRemoveIpr=pRequest; - IRequestCallbackCancel *callback; - - QueryInterface(__uuidof(IRequestCallbackCancel),(void**)&callback); - pRequest->MarkCancelable(callback); - callback->Release(); - } -} - -void CMyDevice::IoSmartCardPower(IWDFIoRequest* pRequest,SIZE_T inBufSize,SIZE_T outBufSize) { - UNREFERENCED_PARAMETER(inBufSize); - UNREFERENCED_PARAMETER(outBufSize); - inFunc; - DWORD code; - if (!getInteger(pRequest, &code)) { - OutputDebugString(L"error getting code\n"); - pRequest->CompleteWithInformation(STATUS_NO_MEDIA, 0); - return; - } - switch (code) { - case SCARD_COLD_RESET: - OutputDebugString(L"[POWR]SCARD_COLD_RESET\n"); - vicc_poweroff(ctx); - vicc_poweron(ctx); - break; - case SCARD_WARM_RESET: - OutputDebugString(L"[POWR]SCARD_WARM_RESET\n"); - vicc_reset(ctx); - break; - case SCARD_POWER_DOWN: - OutputDebugString(L"[POWR]SCARD_POWER_DOWN\n"); - vicc_poweroff(ctx); - } - - if (code==SCARD_COLD_RESET || code==SCARD_WARM_RESET) { - int ATRsize = vicc_getatr(ctx, &outdata); - if (ATRsize <= 0) { - pRequest->CompleteWithInformation(STATUS_NO_MEDIA, 0); - return; - } - outlength = ATRsize; - completeWithBuffer(pRequest,outdata,outlength); - } else { - pRequest->CompleteWithInformation(STATUS_SUCCESS, 0); - } -} - -void CMyDevice::IoSmartCardSetAttribute(IWDFIoRequest* pRequest,SIZE_T inBufSize,SIZE_T outBufSize) { - UNREFERENCED_PARAMETER(inBufSize); - UNREFERENCED_PARAMETER(outBufSize); - inFunc; - - IWDFMemory *inmem=NULL; - pRequest->GetInputMemory(&inmem); - - SIZE_T size; - BYTE *data=(BYTE *)inmem->GetDataBuffer(&size); - - DWORD minCode=*(DWORD*)(data); - bool handled=false; - if (minCode==SCARD_ATTR_DEVICE_IN_USE) { - OutputDebugString(L"[SATT]SCARD_ATTR_DEVICE_IN_USE\n"); - pRequest->CompleteWithInformation(STATUS_SUCCESS, 0); - handled=true; - } - inmem->Release(); - - if (!handled) { - OutputDebugString(L"[SATT]ERROR_NOT_SUPPORTED\n"); - pRequest->CompleteWithInformation(HRESULT_FROM_WIN32(ERROR_NOT_SUPPORTED), 0); - } -} - -void CMyDevice::IoSmartCardTransmit(IWDFIoRequest* pRequest,SIZE_T inBufSize,SIZE_T outBufSize) { - UNREFERENCED_PARAMETER(inBufSize); - UNREFERENCED_PARAMETER(outBufSize); - inFunc; - if (!getBuffer(pRequest,&indata,&inlength)) { - pRequest->CompleteWithInformation(STATUS_INVALID_DEVICE_STATE, 0); - return; - } - if (((SCARD_IO_REQUEST*)indata)->dwProtocol!=SCARD_PROTOCOL_T1) { - pRequest->CompleteWithInformation(STATUS_INVALID_DEVICE_STATE, 0); - return; - } - int RespSize = vicc_transmit(ctx, inlength - sizeof(SCARD_IO_REQUEST), indata + sizeof(SCARD_IO_REQUEST), &outdata); - if (RespSize < 0) - { - pRequest->CompleteWithInformation(STATUS_NO_MEDIA, 0); - return; - } - outlength = RespSize; - BYTE *Resp = (BYTE *) malloc(outlength+sizeof(SCARD_IO_REQUEST)); - if (!Resp) { - pRequest->CompleteWithInformation(STATUS_NO_MEDIA, 0); - return; - } - ((SCARD_IO_REQUEST*)Resp)->cbPciLength=sizeof(SCARD_IO_REQUEST); - ((SCARD_IO_REQUEST*)Resp)->dwProtocol=SCARD_PROTOCOL_T1; - memcpy(Resp + sizeof(SCARD_IO_REQUEST), outdata, outlength); - completeWithBuffer(pRequest,Resp,RespSize+sizeof(SCARD_IO_REQUEST)); -} - -void CMyDevice::IoSmartCardGetAttribute(IWDFIoRequest* pRequest,SIZE_T inBufSize,SIZE_T outBufSize) { - UNREFERENCED_PARAMETER(inBufSize); - DWORD code; - int ATRsize; - - if (!getInteger(pRequest, &code)) { - OutputDebugString(L"error getting code\n"); - pRequest->CompleteWithInformation(STATUS_NO_MEDIA, 0); - return; - } - - switch(code) { - case SCARD_ATTR_CHARACTERISTICS: - // 0x00000000 No special characteristics - OutputDebugString(L"[GATT]SCARD_ATTR_CHARACTERISTICS\n"); - completeWithInteger(pRequest,0); - return; - case SCARD_ATTR_VENDOR_NAME: - OutputDebugString(L"[GATT]SCARD_ATTR_VENDOR_NAME\n"); - completeWithString(pRequest,"Virtual Smart Card Architecture",(int)outBufSize); - return; - case SCARD_ATTR_VENDOR_IFD_TYPE: - OutputDebugString(L"[GATT]SCARD_ATTR_VENDOR_IFD_TYPE\n"); - completeWithString(pRequest,"Virtual PCD",(int)outBufSize); - return; - case SCARD_ATTR_DEVICE_UNIT: - OutputDebugString(L"[GATT]SCARD_ATTR_DEVICE_UNIT\n"); - completeWithInteger(pRequest,0); - return; - case SCARD_ATTR_ATR_STRING: - OutputDebugString(L"[GATT]SCARD_ATTR_ATR_STRING\n"); - ATRsize = vicc_getatr(ctx, &outdata); - if (ATRsize <= 0) - { - pRequest->CompleteWithInformation(STATUS_NO_MEDIA, 0); - return; - } - outlength = ATRsize; - completeWithBuffer(pRequest,outdata,outlength); - return; - case SCARD_ATTR_CURRENT_PROTOCOL_TYPE: - OutputDebugString(L"[GATT]SCARD_ATTR_CURRENT_PROTOCOL_TYPE\n"); - completeWithInteger(pRequest,SCARD_PROTOCOL_T1); // T=1 - return; - default: - OutputDebugString(L"[GATT]ERROR_NOT_SUPPORTED\n"); - pRequest->CompleteWithInformation(HRESULT_FROM_WIN32(ERROR_NOT_SUPPORTED), 0); - } -} - -void CMyDevice::ProcessIoControl(__in IWDFIoQueue* pQueue, - __in IWDFIoRequest* pRequest, - __in ULONG ControlCode, - SIZE_T inBufSize, - SIZE_T outBufSize) -{ - inFunc; - UNREFERENCED_PARAMETER(pQueue); - - if (ControlCode==IOCTL_SMARTCARD_GET_ATTRIBUTE) { - IoSmartCardGetAttribute(pRequest,inBufSize,outBufSize); - return; - } - else if (ControlCode==IOCTL_SMARTCARD_IS_PRESENT) { - IoSmartCardIsPresent(pRequest,inBufSize,outBufSize); - return; - } - else if (ControlCode==IOCTL_SMARTCARD_GET_STATE) { - IoSmartCardGetState(pRequest,inBufSize,outBufSize); - return; - } - else if (ControlCode==IOCTL_SMARTCARD_IS_ABSENT) { - IoSmartCardIsAbsent(pRequest,inBufSize,outBufSize); - return; - } - else if (ControlCode==IOCTL_SMARTCARD_POWER) { - IoSmartCardPower(pRequest,inBufSize,outBufSize); - return; - } - else if (ControlCode==IOCTL_SMARTCARD_SET_ATTRIBUTE) { - IoSmartCardSetAttribute(pRequest,inBufSize,outBufSize); - return; - } - else if (ControlCode==IOCTL_SMARTCARD_TRANSMIT) { - IoSmartCardTransmit(pRequest,inBufSize,outBufSize); - return; - } - OutputDebugString(L"[IOCT]ERROR_NOT_SUPPORTED\n"); - pRequest->CompleteWithInformation(HRESULT_FROM_WIN32(ERROR_NOT_SUPPORTED), 0); - - return; -} - -///////////////////////////////////////////////////////////////////////// -// -// CMyDevice::OnPrepareHardware -// -// Called by UMDF to prepare the hardware for use. -// -// Parameters: -// pWdfDevice - pointer to an IWDFDevice object representing the -// device -// -// Return Values: -// S_OK: success -// -///////////////////////////////////////////////////////////////////////// -HRESULT CMyDevice::OnPrepareHardware( - __in IWDFDevice* pWdfDevice - ) -{ - inFunc; - // Store the IWDFDevice pointer - m_pWdfDevice = pWdfDevice; - - // Configure the default IO Queue - HRESULT hr = CMyQueue::CreateInstance(m_pWdfDevice, this); - - ctx = vicc_init(NULL, VPCDPORT); - - return hr; -} - - -///////////////////////////////////////////////////////////////////////// -// -// CMyDevice::OnReleaseHardware -// -// Called by WUDF to uninitialize the hardware. -// -// Parameters: -// pWdfDevice - pointer to an IWDFDevice object for the device -// -// Return Values: -// S_OK: -// -///////////////////////////////////////////////////////////////////////// -HRESULT CMyDevice::OnReleaseHardware( - __in IWDFDevice* pWdfDevice - ) -{ - inFunc; - UNREFERENCED_PARAMETER(pWdfDevice); - - // Release the IWDFDevice handle, if it matches - if (pWdfDevice == m_pWdfDevice.p) - { - vicc_eject(ctx); - vicc_exit(ctx); - ctx = NULL; - m_pWdfDevice.Release(); - } - - return S_OK; -} - - -HRESULT CMyDevice::OnD0Entry(IN IWDFDevice* pWdfDevice,IN WDF_POWER_DEVICE_STATE previousState) { - UNREFERENCED_PARAMETER(pWdfDevice); - UNREFERENCED_PARAMETER(previousState); - inFunc; - vicc_poweroff(ctx); - return S_OK; -} -HRESULT CMyDevice::OnD0Exit(IN IWDFDevice* pWdfDevice,IN WDF_POWER_DEVICE_STATE newState) { - UNREFERENCED_PARAMETER(pWdfDevice); - UNREFERENCED_PARAMETER(newState); - inFunc; - vicc_poweron(ctx); - return S_OK; -} - -void CMyDevice::shutDown(){ - if (waitRemoveIpr!=NULL) { - if (waitRemoveIpr->UnmarkCancelable()==S_OK) - waitRemoveIpr->Complete(HRESULT_FROM_WIN32(ERROR_CANCELLED)); - waitRemoveIpr=NULL; - } - if (waitInsertIpr!=NULL) { - if (waitInsertIpr->UnmarkCancelable()==S_OK) - waitInsertIpr->Complete(HRESULT_FROM_WIN32(ERROR_CANCELLED)); - waitInsertIpr=NULL; - } - free(outdata); - outdata = NULL; - outlength = 0; - free(indata); - indata = NULL; - inlength = 0; -} -HRESULT CMyDevice::OnQueryRemove(IN IWDFDevice* pWdfDevice) { - UNREFERENCED_PARAMETER(pWdfDevice); - inFunc; - shutDown(); - return S_OK; -} -HRESULT CMyDevice::OnQueryStop(IN IWDFDevice* pWdfDevice) { - UNREFERENCED_PARAMETER(pWdfDevice); - inFunc; - shutDown(); - return S_OK; -} -void CMyDevice::OnSurpriseRemoval(IN IWDFDevice* pWdfDevice) { - UNREFERENCED_PARAMETER(pWdfDevice); - inFunc; - shutDown(); -} - -STDMETHODIMP_ (void) CMyDevice::OnCancel(IN IWDFIoRequest* pWdfRequest) { - inFunc; - if (pWdfRequest==waitRemoveIpr) { - OutputDebugString(L"Cancel Remove\n"); - waitRemoveIpr=NULL; - } else if (pWdfRequest==waitInsertIpr) { - OutputDebugString(L"Cancel Insert\n"); - waitInsertIpr=NULL; - } - pWdfRequest->CompleteWithInformation(HRESULT_FROM_WIN32(ERROR_CANCELLED), 0); -} diff --git a/virtualsmartcard/win32/vpcd/makefile.inc.props b/virtualsmartcard/win32/vpcd/makefile.inc.props deleted file mode 100644 index e6e0ad2..0000000 --- a/virtualsmartcard/win32/vpcd/makefile.inc.props +++ /dev/null @@ -1,37 +0,0 @@ - - - - stampinf - - - - ConvertedTarget0_Disabled - Converted Target 0 - $(OBJ_PATH)\$(O)\vpcd.inf - - - copy %24%28%40B%29.inx %24%40 - $(STAMP) -f %24%40 -a $(_BUILDARCH) -k $(KMDF_VERSION_MAJOR).$(KMDF_VERSION_MINOR) -u $(UMDF_VERSION_MAJOR).$(UMDF_VERSION_MINOR).0 - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/virtualsmartcard/win32/vpcd/memory.h b/virtualsmartcard/win32/vpcd/memory.h deleted file mode 100644 index a52a2c7..0000000 --- a/virtualsmartcard/win32/vpcd/memory.h +++ /dev/null @@ -1,9 +0,0 @@ -#pragma once -#include "internal.h" - - -bool getBuffer(IWDFIoRequest *pRequest, BYTE **buffer, SIZE_T *bufferLen); -void completeWithString(IWDFIoRequest* pRequest,char *result,int outSize); -void completeWithBuffer(IWDFIoRequest* pRequest,BYTE *result,int inSize); -void completeWithInteger(IWDFIoRequest* pRequest,DWORD result); -bool getInteger(IWDFIoRequest *pRequest, DWORD *integer); diff --git a/virtualsmartcard/win32/vpcd/sources.props b/virtualsmartcard/win32/vpcd/sources.props deleted file mode 100644 index f5a9153..0000000 --- a/virtualsmartcard/win32/vpcd/sources.props +++ /dev/null @@ -1,33 +0,0 @@ - - - - 1 - 9 - 1 - 9 - vpcd - DYNLINK - 1 - 71 - 1 - $(C_DEFINES) /D_UNICODE /DUNICODE - $(LATEST_WIN32_WINNT_VERSION) - <_NT_TARGET_VERSION Condition="'$(OVERRIDE__NT_TARGET_VERSION)'!='true'">$(_NT_TARGET_VERSION_WIN7) - $(LATEST_NTDDI_VERSION) - _DllMainCRTStartup - exports.def - vpcd.rc driver.cpp device.cpp queue.cpp memory.cpp DllMain.cpp VirtualSCReader.idl - $(INCLUDES); $(SDK_INC_PATH); $(DDK_INC_PATH); $(UMDF_INC_PATH)\10; - /W4 /WX - $(SDK_LIB_PATH)\strsafe.lib $(SDK_LIB_PATH)\kernel32.lib $(SDK_LIB_PATH)\ole32.lib $(SDK_LIB_PATH)\oleaut32.lib $(SDK_LIB_PATH)\uuid.lib $(SDK_LIB_PATH)\user32.lib $(SDK_LIB_PATH)\advapi32.lib $(SDK_LIB_PATH)\shlwapi.lib $(SDK_LIB_PATH)\ws2_32.lib - $(OBJ_PATH)\$(O)\vpcd.inf - wudf - - - - 1 - - - - - \ No newline at end of file diff --git a/virtualsmartcard/win32/vpcd/vpcd-Package/vpcd-Package.vcxproj b/virtualsmartcard/win32/vpcd/vpcd-Package/vpcd-Package.vcxproj deleted file mode 100644 index c600021..0000000 --- a/virtualsmartcard/win32/vpcd/vpcd-Package/vpcd-Package.vcxproj +++ /dev/null @@ -1,152 +0,0 @@ - - - - - Win8.1 Debug - Win32 - - - Win8.1 Release - Win32 - - - Win8 Debug - Win32 - - - Win8 Release - Win32 - - - Win7 Debug - Win32 - - - Win7 Release - Win32 - - - Win8.1 Debug - x64 - - - Win8.1 Release - x64 - - - Win8 Debug - x64 - - - Win8 Release - x64 - - - Win7 Debug - x64 - - - Win7 Release - x64 - - - - WindowsKernelModeDriver8.1 - Utility - Package - true - Win8.1 Debug - - - - {7D06C4DD-96FC-4421-96F1-C90A6093A6F5} - $(MSBuildProjectName) - - - WindowsV6.3 - true - - - WindowsV6.3 - false - - - Windows8 - true - - - Windows8 - false - - - Windows7 - true - - - Windows7 - false - - - WindowsV6.3 - true - - - WindowsV6.3 - false - - - Windows8 - true - - - Windows8 - false - - - Windows7 - true - - - Windows7 - false - - - - - - - - - - - DbgengRemoteDebugger - False - False - None - - - - - - %PathToInf% - False - False - True - - 133563 - - - - - - - - - - {B019D202-420C-484D-9303-45B552A05B95} - - - - - - \ No newline at end of file diff --git a/virtualsmartcard/win32/vpcd/vpcd.sln b/virtualsmartcard/win32/vpcd/vpcd.sln deleted file mode 100644 index d1dfbb2..0000000 --- a/virtualsmartcard/win32/vpcd/vpcd.sln +++ /dev/null @@ -1,83 +0,0 @@ - -Microsoft Visual Studio Solution File, Format Version 12.00 -# Visual Studio 2013 -VisualStudioVersion = 12.0 -MinimumVisualStudioVersion = 12.0 -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Vpcd-Package", "Vpcd-Package", "{B4A2C5E7-24D0-4EBB-A564-5F52DD858932}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "vpcd-Package", "vpcd-Package\vpcd-Package.vcxproj", "{7D06C4DD-96FC-4421-96F1-C90A6093A6F5}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "vpcd", "vpcd.vcxproj", "{B019D202-420C-484D-9303-45B552A05B95}" -EndProject -Global - GlobalSection(SolutionConfigurationPlatforms) = preSolution - Win8.1 Debug|Win32 = Win8.1 Debug|Win32 - Win8.1 Debug|x64 = Win8.1 Debug|x64 - Win8.1 Release|Win32 = Win8.1 Release|Win32 - Win8.1 Release|x64 = Win8.1 Release|x64 - Win8 Debug|Win32 = Win8 Debug|Win32 - Win8 Debug|x64 = Win8 Debug|x64 - Win8 Release|Win32 = Win8 Release|Win32 - Win8 Release|x64 = Win8 Release|x64 - Win7 Debug|Win32 = Win7 Debug|Win32 - Win7 Debug|x64 = Win7 Debug|x64 - Win7 Release|Win32 = Win7 Release|Win32 - Win7 Release|x64 = Win7 Release|x64 - EndGlobalSection - GlobalSection(ProjectConfigurationPlatforms) = postSolution - {7D06C4DD-96FC-4421-96F1-C90A6093A6F5}.Win8.1 Debug|Win32.ActiveCfg = Win8.1 Debug|Win32 - {7D06C4DD-96FC-4421-96F1-C90A6093A6F5}.Win8.1 Debug|Win32.Build.0 = Win8.1 Debug|Win32 - {7D06C4DD-96FC-4421-96F1-C90A6093A6F5}.Win8.1 Debug|x64.ActiveCfg = Win8.1 Debug|x64 - {7D06C4DD-96FC-4421-96F1-C90A6093A6F5}.Win8.1 Debug|x64.Build.0 = Win8.1 Debug|x64 - {7D06C4DD-96FC-4421-96F1-C90A6093A6F5}.Win8.1 Release|Win32.ActiveCfg = Win8.1 Release|Win32 - {7D06C4DD-96FC-4421-96F1-C90A6093A6F5}.Win8.1 Release|Win32.Build.0 = Win8.1 Release|Win32 - {7D06C4DD-96FC-4421-96F1-C90A6093A6F5}.Win8.1 Release|x64.ActiveCfg = Win8.1 Release|x64 - {7D06C4DD-96FC-4421-96F1-C90A6093A6F5}.Win8.1 Release|x64.Build.0 = Win8.1 Release|x64 - {7D06C4DD-96FC-4421-96F1-C90A6093A6F5}.Win8 Debug|Win32.ActiveCfg = Win8 Debug|Win32 - {7D06C4DD-96FC-4421-96F1-C90A6093A6F5}.Win8 Debug|Win32.Build.0 = Win8 Debug|Win32 - {7D06C4DD-96FC-4421-96F1-C90A6093A6F5}.Win8 Debug|x64.ActiveCfg = Win8 Debug|x64 - {7D06C4DD-96FC-4421-96F1-C90A6093A6F5}.Win8 Debug|x64.Build.0 = Win8 Debug|x64 - {7D06C4DD-96FC-4421-96F1-C90A6093A6F5}.Win8 Release|Win32.ActiveCfg = Win8 Release|Win32 - {7D06C4DD-96FC-4421-96F1-C90A6093A6F5}.Win8 Release|Win32.Build.0 = Win8 Release|Win32 - {7D06C4DD-96FC-4421-96F1-C90A6093A6F5}.Win8 Release|x64.ActiveCfg = Win8 Release|x64 - {7D06C4DD-96FC-4421-96F1-C90A6093A6F5}.Win8 Release|x64.Build.0 = Win8 Release|x64 - {7D06C4DD-96FC-4421-96F1-C90A6093A6F5}.Win7 Debug|Win32.ActiveCfg = Win7 Debug|Win32 - {7D06C4DD-96FC-4421-96F1-C90A6093A6F5}.Win7 Debug|Win32.Build.0 = Win7 Debug|Win32 - {7D06C4DD-96FC-4421-96F1-C90A6093A6F5}.Win7 Debug|x64.ActiveCfg = Win7 Debug|x64 - {7D06C4DD-96FC-4421-96F1-C90A6093A6F5}.Win7 Debug|x64.Build.0 = Win7 Debug|x64 - {7D06C4DD-96FC-4421-96F1-C90A6093A6F5}.Win7 Release|Win32.ActiveCfg = Win7 Release|Win32 - {7D06C4DD-96FC-4421-96F1-C90A6093A6F5}.Win7 Release|Win32.Build.0 = Win7 Release|Win32 - {7D06C4DD-96FC-4421-96F1-C90A6093A6F5}.Win7 Release|x64.ActiveCfg = Win7 Release|x64 - {7D06C4DD-96FC-4421-96F1-C90A6093A6F5}.Win7 Release|x64.Build.0 = Win7 Release|x64 - {B019D202-420C-484D-9303-45B552A05B95}.Win8.1 Debug|Win32.ActiveCfg = Win8.1 Debug|Win32 - {B019D202-420C-484D-9303-45B552A05B95}.Win8.1 Debug|Win32.Build.0 = Win8.1 Debug|Win32 - {B019D202-420C-484D-9303-45B552A05B95}.Win8.1 Debug|x64.ActiveCfg = Win8.1 Debug|x64 - {B019D202-420C-484D-9303-45B552A05B95}.Win8.1 Debug|x64.Build.0 = Win8.1 Debug|x64 - {B019D202-420C-484D-9303-45B552A05B95}.Win8.1 Release|Win32.ActiveCfg = Win8.1 Release|Win32 - {B019D202-420C-484D-9303-45B552A05B95}.Win8.1 Release|Win32.Build.0 = Win8.1 Release|Win32 - {B019D202-420C-484D-9303-45B552A05B95}.Win8.1 Release|x64.ActiveCfg = Win8.1 Release|x64 - {B019D202-420C-484D-9303-45B552A05B95}.Win8.1 Release|x64.Build.0 = Win8.1 Release|x64 - {B019D202-420C-484D-9303-45B552A05B95}.Win8 Debug|Win32.ActiveCfg = Win8 Debug|Win32 - {B019D202-420C-484D-9303-45B552A05B95}.Win8 Debug|Win32.Build.0 = Win8 Debug|Win32 - {B019D202-420C-484D-9303-45B552A05B95}.Win8 Debug|x64.ActiveCfg = Win8 Debug|x64 - {B019D202-420C-484D-9303-45B552A05B95}.Win8 Debug|x64.Build.0 = Win8 Debug|x64 - {B019D202-420C-484D-9303-45B552A05B95}.Win8 Release|Win32.ActiveCfg = Win8 Release|Win32 - {B019D202-420C-484D-9303-45B552A05B95}.Win8 Release|Win32.Build.0 = Win8 Release|Win32 - {B019D202-420C-484D-9303-45B552A05B95}.Win8 Release|x64.ActiveCfg = Win8 Release|x64 - {B019D202-420C-484D-9303-45B552A05B95}.Win8 Release|x64.Build.0 = Win8 Release|x64 - {B019D202-420C-484D-9303-45B552A05B95}.Win7 Debug|Win32.ActiveCfg = Win7 Debug|Win32 - {B019D202-420C-484D-9303-45B552A05B95}.Win7 Debug|Win32.Build.0 = Win7 Debug|Win32 - {B019D202-420C-484D-9303-45B552A05B95}.Win7 Debug|x64.ActiveCfg = Win7 Debug|x64 - {B019D202-420C-484D-9303-45B552A05B95}.Win7 Debug|x64.Build.0 = Win7 Debug|x64 - {B019D202-420C-484D-9303-45B552A05B95}.Win7 Release|Win32.ActiveCfg = Win7 Release|Win32 - {B019D202-420C-484D-9303-45B552A05B95}.Win7 Release|Win32.Build.0 = Win7 Release|Win32 - {B019D202-420C-484D-9303-45B552A05B95}.Win7 Release|x64.ActiveCfg = Win7 Release|x64 - {B019D202-420C-484D-9303-45B552A05B95}.Win7 Release|x64.Build.0 = Win7 Release|x64 - EndGlobalSection - GlobalSection(SolutionProperties) = preSolution - HideSolutionNode = FALSE - EndGlobalSection - GlobalSection(NestedProjects) = preSolution - {7D06C4DD-96FC-4421-96F1-C90A6093A6F5} = {B4A2C5E7-24D0-4EBB-A564-5F52DD858932} - EndGlobalSection -EndGlobal diff --git a/virtualsmartcard/win32/vpcd/vpcd.vcxproj b/virtualsmartcard/win32/vpcd/vpcd.vcxproj deleted file mode 100644 index 470928e..0000000 --- a/virtualsmartcard/win32/vpcd/vpcd.vcxproj +++ /dev/null @@ -1,217 +0,0 @@ - - - - - Win8.1 Debug - Win32 - - - Win8 Debug - Win32 - - - Win7 Debug - Win32 - - - Win8.1 Release - Win32 - - - Win8 Release - Win32 - - - Win7 Release - Win32 - - - Win8.1 Debug - x64 - - - Win8 Debug - x64 - - - Win7 Debug - x64 - - - Win8.1 Release - x64 - - - Win8 Release - x64 - - - Win7 Release - x64 - - - - WindowsUserModeDriver8.1 - DynamicLibrary - UMDF - vpcd - Win8.1 Debug - Win32 - True - - - - 1.0 - $(Configuration.Replace(' ','')) - $(BUILD_ALT_DIR)\$(Platform)\ - $(BUILD_ALT_DIR)\x86\ - $(IntDir) - - - - - - {B019D202-420C-484D-9303-45B552A05B95} - $(MSBuildProjectName) - - - WindowsV6.3 - True - - - Win8 - True - - - Win7 - True - - - WindowsV6.3 - False - - - Win8 - False - - - Win7 - False - - - WindowsV6.3 - True - - - Win8 - True - - - Win7 - True - - - WindowsV6.3 - False - - - Win8 - False - - - Win7 - False - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - $(_BUILDARCH) - true - 1.9 - 1.9.0 - $(OBJ_PATH)\$(O)\vpcd.inf - - - - - $(ProjectDir)\..\..\src\vpcd;%(AdditionalIncludeDirectories);$(Includes);$(User_Includes) - - - - - - - - - - - - - - - - $(KIT_SHARED_INC_PATH) - true - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file