diff --git a/ThunksList.md b/ThunksList.md index 27f67ab..08270c1 100644 --- a/ThunksList.md +++ b/ThunksList.md @@ -731,6 +731,18 @@ | WinHttpGetProxyResult | 不存在时,内部实现。 | WinHttpFreeProxyResult | 不存在时,内部实现。 +## WinUsb.dll +| 函数 | Fallback +| ---- | ----------- +| WinUsb_Free | 不存在时,报告ERROR_INVALID_HANDLE。 +| WinUsb_GetAssociatedInterface | 不存在时,报告ERROR_INVALID_HANDLE。 +| WinUsb_GetOverlappedResult | 不存在时,报告ERROR_INVALID_HANDLE。 +| WinUsb_Initialize | 不存在时,报告ERROR_INVALID_HANDLE。 +| WinUsb_ReadPipe | 不存在时,报告ERROR_INVALID_HANDLE。 +| WinUsb_ResetPipe | 不存在时,报告ERROR_INVALID_HANDLE。 +| WinUsb_SetCurrentAlternateSetting | 不存在时,报告ERROR_INVALID_HANDLE。 +| WinUsb_WritePipe | 不存在时,报告ERROR_INVALID_HANDLE。 + ## ws2_32.dll | 函数 | Fallback | ---- | ----------- diff --git a/src/Thunks/PropSys.hpp b/src/Thunks/PropSys.hpp index 105688f..1c0bc5f 100644 --- a/src/Thunks/PropSys.hpp +++ b/src/Thunks/PropSys.hpp @@ -430,7 +430,7 @@ namespace YY::Thunks int _nResult = 0; if (SUCCEEDED(SafeArrayGetElement(_Rigth.parray, &i, &_RightItem))) { - _nResult = ::VariantCompare(_LeftItem, _RightItem); + _nResult = _CRT_CONCATENATE(__FALLBACK_PREFIX, VariantCompare)(_LeftItem, _RightItem); VariantClear(&_RightItem); } VariantClear(&_LeftItem); diff --git a/src/Thunks/WinUsb.hpp b/src/Thunks/WinUsb.hpp new file mode 100644 index 0000000..11aea0f --- /dev/null +++ b/src/Thunks/WinUsb.hpp @@ -0,0 +1,235 @@ +#if (YY_Thunks_Support_Version < NTDDI_WIN6) +#include +#endif + +namespace YY::Thunks +{ +#if (YY_Thunks_Support_Version < NTDDI_WIN6) + + // 最低受支持XP,但是XP需要打补丁,Vista开始直接内置 + __DEFINE_THUNK( + winusb, + 28, + BOOL, + __stdcall, + WinUsb_ControlTransfer, + _In_ WINUSB_INTERFACE_HANDLE InterfaceHandle, + _In_ WINUSB_SETUP_PACKET SetupPacket, + _Out_writes_bytes_to_opt_(BufferLength, *LengthTransferred) PUCHAR Buffer, + _In_ ULONG BufferLength, + _Out_opt_ PULONG LengthTransferred, + _In_opt_ LPOVERLAPPED Overlapped + ) + { + if (const auto _pfnWinUsb_ControlTransfer = try_get_WinUsb_ControlTransfer()) + { + return _pfnWinUsb_ControlTransfer(InterfaceHandle, SetupPacket, Buffer, BufferLength, LengthTransferred, Overlapped); + } + + SetLastError(ERROR_INVALID_HANDLE); + return FALSE; + } +#endif + + +#if (YY_Thunks_Support_Version < NTDDI_WIN6) + + // 最低受支持XP,但是XP需要打补丁,Vista开始直接内置 + __DEFINE_THUNK( + winusb, + 4, + BOOL, + __stdcall, + WinUsb_Free, + _In_ WINUSB_INTERFACE_HANDLE InterfaceHandle + ) + { + if (const auto _pfnWinUsb_Free = try_get_WinUsb_Free()) + { + return _pfnWinUsb_Free(InterfaceHandle); + } + + SetLastError(ERROR_INVALID_HANDLE); + return FALSE; + } +#endif + + +#if (YY_Thunks_Support_Version < NTDDI_WIN6) + + // 最低受支持XP,但是XP需要打补丁,Vista开始直接内置 + __DEFINE_THUNK( + winusb, + 12, + BOOL, + __stdcall, + WinUsb_GetAssociatedInterface, + _In_ WINUSB_INTERFACE_HANDLE InterfaceHandle, + _In_ UCHAR AssociatedInterfaceIndex, + _Out_ PWINUSB_INTERFACE_HANDLE AssociatedInterfaceHandle + ) + { + if (const auto _pfnWinUsb_GetAssociatedInterface = try_get_WinUsb_GetAssociatedInterface()) + { + return _pfnWinUsb_GetAssociatedInterface(InterfaceHandle, AssociatedInterfaceIndex, AssociatedInterfaceHandle); + } + + SetLastError(ERROR_INVALID_HANDLE); + return FALSE; + } +#endif + + +#if (YY_Thunks_Support_Version < NTDDI_WIN6) + + // 最低受支持XP,但是XP需要打补丁,Vista开始直接内置 + __DEFINE_THUNK( + winusb, + 16, + BOOL, + __stdcall, + WinUsb_GetOverlappedResult, + _In_ WINUSB_INTERFACE_HANDLE InterfaceHandle, + _In_ LPOVERLAPPED lpOverlapped, + _Out_ LPDWORD lpNumberOfBytesTransferred, + _In_ BOOL bWait + ) + { + if (const auto _pfnWinUsb_GetOverlappedResult = try_get_WinUsb_GetOverlappedResult()) + { + return _pfnWinUsb_GetOverlappedResult(InterfaceHandle, lpOverlapped, lpNumberOfBytesTransferred, bWait); + } + + SetLastError(ERROR_INVALID_HANDLE); + return FALSE; + } +#endif + + +#if (YY_Thunks_Support_Version < NTDDI_WIN6) + + // 最低受支持XP,但是XP需要打补丁,Vista开始直接内置 + __DEFINE_THUNK( + winusb, + 8, + BOOL, + __stdcall, + WinUsb_Initialize, + _In_ HANDLE DeviceHandle, + _Out_ PWINUSB_INTERFACE_HANDLE InterfaceHandle + ) + { + if (const auto _pfnWinUsb_Initialize = try_get_WinUsb_Initialize()) + { + return _pfnWinUsb_Initialize(DeviceHandle, InterfaceHandle); + } + + SetLastError(ERROR_INVALID_HANDLE); + return FALSE; + } +#endif + + +#if (YY_Thunks_Support_Version < NTDDI_WIN6) + + // 最低受支持XP,但是XP需要打补丁,Vista开始直接内置 + __DEFINE_THUNK( + winusb, + 24, + BOOL, + __stdcall, + WinUsb_ReadPipe, + _In_ WINUSB_INTERFACE_HANDLE InterfaceHandle, + _In_ UCHAR PipeID, + _Out_writes_bytes_to_opt_(BufferLength,*LengthTransferred) PUCHAR Buffer, + _In_ ULONG BufferLength, + _Out_opt_ PULONG LengthTransferred, + _In_opt_ LPOVERLAPPED Overlapped + ) + { + if (const auto _pfnWinUsb_ReadPipe = try_get_WinUsb_ReadPipe()) + { + return _pfnWinUsb_ReadPipe(InterfaceHandle, PipeID, Buffer, BufferLength, LengthTransferred, Overlapped); + } + + SetLastError(ERROR_INVALID_HANDLE); + return FALSE; + } +#endif + + +#if (YY_Thunks_Support_Version < NTDDI_WIN6) + + // 最低受支持XP,但是XP需要打补丁,Vista开始直接内置 + __DEFINE_THUNK( + winusb, + 24, + BOOL, + __stdcall, + WinUsb_ResetPipe, + _In_ WINUSB_INTERFACE_HANDLE InterfaceHandle, + _In_ UCHAR PipeID + ) + { + if (const auto _pfnWinUsb_ResetPipe = try_get_WinUsb_ResetPipe()) + { + return _pfnWinUsb_ResetPipe(InterfaceHandle, PipeID); + } + + SetLastError(ERROR_INVALID_HANDLE); + return FALSE; + } +#endif + + +#if (YY_Thunks_Support_Version < NTDDI_WIN6) + + // 最低受支持XP,但是XP需要打补丁,Vista开始直接内置 + __DEFINE_THUNK( + winusb, + 8, + BOOL, + __stdcall, + WinUsb_SetCurrentAlternateSetting, + _In_ WINUSB_INTERFACE_HANDLE InterfaceHandle, + _In_ UCHAR SettingNumber + ) + { + if (const auto _pfnWinUsb_SetCurrentAlternateSetting = try_get_WinUsb_SetCurrentAlternateSetting()) + { + return _pfnWinUsb_SetCurrentAlternateSetting(InterfaceHandle, SettingNumber); + } + + SetLastError(ERROR_INVALID_HANDLE); + return FALSE; + } +#endif + + +#if (YY_Thunks_Support_Version < NTDDI_WIN6) + + // 最低受支持XP,但是XP需要打补丁,Vista开始直接内置 + __DEFINE_THUNK( + winusb, + 8, + BOOL, + __stdcall, + WinUsb_WritePipe, + _In_ WINUSB_INTERFACE_HANDLE InterfaceHandle, + _In_ UCHAR PipeID, + _In_reads_bytes_(BufferLength) PUCHAR Buffer, + _In_ ULONG BufferLength, + _Out_opt_ PULONG LengthTransferred, + _In_opt_ LPOVERLAPPED Overlapped + ) + { + if (const auto _pfnWinUsb_WritePipe = try_get_WinUsb_WritePipe()) + { + return _pfnWinUsb_WritePipe(InterfaceHandle, PipeID, Buffer, BufferLength, LengthTransferred, Overlapped); + } + + SetLastError(ERROR_INVALID_HANDLE); + return FALSE; + } +#endif +} diff --git a/src/Thunks/YY_Thunks.cpp b/src/Thunks/YY_Thunks.cpp index a74eefc..b6d8f87 100644 --- a/src/Thunks/YY_Thunks.cpp +++ b/src/Thunks/YY_Thunks.cpp @@ -60,9 +60,10 @@ YY-Thunks支持的控制宏: _APPLY(bluetoothapis, "bluetoothapis" , 0 ) \ _APPLY(netapi32, "netapi32" , 0 ) \ _APPLY(powrprof, "powrprof" , 0 ) \ - _APPLY(propsys, "propsys" , 0 ) \ + _APPLY(propsys, "propsys" , 0 ) \ _APPLY(wevtapi, "wevtapi" , 0 ) \ _APPLY(winhttp, "winhttp" , 0 ) \ + _APPLY(winusb, "winusb" , 0 ) \ _APPLY(zipfldr, "zipfldr" , LOAD_AS_DATA_FILE ) \ _APPLY(api_ms_win_core_handle_l1_1_0, "api-ms-win-core-handle-l1-1-0" , 0 ) \ _APPLY(api_ms_win_core_realtime_l1_1_1, "api-ms-win-core-realtime-l1-1-1" , 0 ) \ diff --git a/src/Thunks/api-ms-win-security-base.hpp b/src/Thunks/api-ms-win-security-base.hpp index a6b744e..a20360a 100644 --- a/src/Thunks/api-ms-win-security-base.hpp +++ b/src/Thunks/api-ms-win-security-base.hpp @@ -82,7 +82,7 @@ return FALSE; } - const auto _cbData = (_pLabelSid->SubAuthorityCount + 4) * sizeof(DWORD); + const WORD _cbData = (_pLabelSid->SubAuthorityCount + 4) * sizeof(DWORD); if (_pFirstFree == nullptr || PBYTE(_pFirstFree) + _cbData > PBYTE(_pAcl) + _pAcl->AclSize) { // internal::BaseSetLastNTError(0xC0000099); diff --git a/src/Thunks/shell32.hpp b/src/Thunks/shell32.hpp index f43c280..2b8a0b1 100644 --- a/src/Thunks/shell32.hpp +++ b/src/Thunks/shell32.hpp @@ -3,6 +3,14 @@ #include #endif +#if (YY_Thunks_Support_Version < NTDDI_WIN6) +// FOLDERID_Windows +#include + +// BHID_SFObject +#include +#endif + #if (YY_Thunks_Support_Version < NTDDI_WIN6) && !defined(__Comment_Lib_shell32) #define __Comment_Lib_shell32 #pragma comment(lib, "Shell32.lib") diff --git a/src/YY-Thunks.UnitTest/PropSys.UnitTest.cpp b/src/YY-Thunks.UnitTest/PropSys.UnitTest.cpp index 609d5fc..1d04806 100644 --- a/src/YY-Thunks.UnitTest/PropSys.UnitTest.cpp +++ b/src/YY-Thunks.UnitTest/PropSys.UnitTest.cpp @@ -59,7 +59,7 @@ namespace PropSys VARIANT _Rigth = {}; _Left.vt = VT_R4; - _Left.fltVal = 8.1; + _Left.fltVal = 8.1f; _Rigth.vt = VT_R4; _Rigth.fltVal = 8; diff --git a/src/YY-Thunks.UnitTest/YY-Thunks.UnitTest.vcxproj b/src/YY-Thunks.UnitTest/YY-Thunks.UnitTest.vcxproj index a478c58..2323c97 100644 --- a/src/YY-Thunks.UnitTest/YY-Thunks.UnitTest.vcxproj +++ b/src/YY-Thunks.UnitTest/YY-Thunks.UnitTest.vcxproj @@ -259,6 +259,7 @@ + diff --git a/src/YY-Thunks.UnitTest/YY-Thunks.UnitTest.vcxproj.filters b/src/YY-Thunks.UnitTest/YY-Thunks.UnitTest.vcxproj.filters index 077d7b8..af11d26 100644 --- a/src/YY-Thunks.UnitTest/YY-Thunks.UnitTest.vcxproj.filters +++ b/src/YY-Thunks.UnitTest/YY-Thunks.UnitTest.vcxproj.filters @@ -350,6 +350,9 @@ Thunks + + Thunks +