Skip to content

Commit

Permalink
Fea,补充Chormium使用的WinUsb接口
Browse files Browse the repository at this point in the history
- 添加 WinUsb_Free
- 添加WinUsb_GetAssociatedInterface
- 添加WinUsb_GetOverlappedResult
- 添加WinUsb_Initialize
- 添加WinUsb_ReadPipe
- 添加WinUsb_ResetPipe
- 添加WinUsb_SetCurrentAlternateSetting
- 添加WinUsb_WritePipe
  • Loading branch information
mingkuang-Chuyu committed Jun 22, 2024
1 parent 2cdd8fa commit 4cf1122
Show file tree
Hide file tree
Showing 9 changed files with 264 additions and 4 deletions.
12 changes: 12 additions & 0 deletions ThunksList.md
Original file line number Diff line number Diff line change
Expand Up @@ -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
| ---- | -----------
Expand Down
2 changes: 1 addition & 1 deletion src/Thunks/PropSys.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand Down
235 changes: 235 additions & 0 deletions src/Thunks/WinUsb.hpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,235 @@
#if (YY_Thunks_Support_Version < NTDDI_WIN6)
#include <winusb.h>
#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
}
3 changes: 2 additions & 1 deletion src/Thunks/YY_Thunks.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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 ) \
Expand Down
2 changes: 1 addition & 1 deletion src/Thunks/api-ms-win-security-base.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand Down
8 changes: 8 additions & 0 deletions src/Thunks/shell32.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,14 @@
#include <Shlobj.h>
#endif

#if (YY_Thunks_Support_Version < NTDDI_WIN6)
// FOLDERID_Windows
#include <Knownfolders.h>

// BHID_SFObject
#include <ShlGuid.h>
#endif

#if (YY_Thunks_Support_Version < NTDDI_WIN6) && !defined(__Comment_Lib_shell32)
#define __Comment_Lib_shell32
#pragma comment(lib, "Shell32.lib")
Expand Down
2 changes: 1 addition & 1 deletion src/YY-Thunks.UnitTest/PropSys.UnitTest.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down
1 change: 1 addition & 0 deletions src/YY-Thunks.UnitTest/YY-Thunks.UnitTest.vcxproj
Original file line number Diff line number Diff line change
Expand Up @@ -259,6 +259,7 @@
<ClInclude Include="..\Thunks\uxtheme.hpp" />
<ClInclude Include="..\Thunks\wevtapi.hpp" />
<ClInclude Include="..\Thunks\WinHttp.hpp" />
<ClInclude Include="..\Thunks\WinUsb.hpp" />
<ClInclude Include="..\Thunks\YY_Thunks.h" />
<ClInclude Include="pch.h" />
<ClInclude Include="..\Thunks\api-ms-win-core-datetime.hpp" />
Expand Down
3 changes: 3 additions & 0 deletions src/YY-Thunks.UnitTest/YY-Thunks.UnitTest.vcxproj.filters
Original file line number Diff line number Diff line change
Expand Up @@ -350,6 +350,9 @@
<ClInclude Include="..\Thunks\PropSys.hpp">
<Filter>Thunks</Filter>
</ClInclude>
<ClInclude Include="..\Thunks\WinUsb.hpp">
<Filter>Thunks</Filter>
</ClInclude>
</ItemGroup>
<ItemGroup>
<None Include="..\def\x86\PSAPI2Kernel32.def">
Expand Down

0 comments on commit 4cf1122

Please sign in to comment.