VirtualBox

Changeset 70341 in vbox for trunk/src/VBox/Runtime/r3


Ignore:
Timestamp:
Dec 26, 2017 2:42:28 PM (7 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
119941
Message:

IPRT: More NT 3.1 compatibility tweaking.

Location:
trunk/src/VBox/Runtime/r3/win
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/Runtime/r3/win/vcc100-kernel32-fakes.cpp

    r70213 r70341  
    2929*   Header Files                                                                                                                 *
    3030*********************************************************************************************************************************/
    31 #define RT_NO_STRICT /* Minimal deps so that it works on NT 3.51 too. */
     31//#define RT_NO_STRICT /* Minimal deps so that it works on NT 3.51 too. */
    3232#include <iprt/cdefs.h>
    3333#include <iprt/types.h>
     
    5555#define VerifyVersionInfoA                      Ignore_VerifyVersionInfoA
    5656#define VerSetConditionMask                     Ignore_VerSetConditionMask
    57 #define IsProcessorFeaturePresent               Ignore_IsProcessorFeaturePresent /* NT 3.51 start */
     57#define IsProcessorFeaturePresent               Ignore_IsProcessorFeaturePresent    /* NT 3.51 start */
    5858#define CancelIo                                Ignore_CancelIo
    59 #define IsDebuggerPresent                       Ignore_IsDebuggerPresent /* NT 3.50 start */
     59#define IsDebuggerPresent                       Ignore_IsDebuggerPresent            /* NT 3.50 start */
    6060#define GetSystemTimeAsFileTime                 Ignore_GetSystemTimeAsFileTime
     61#define GetVersionExA                           Ignore_GetVersionExA                /* NT 3.1 start */
     62#define GetVersionExW                           Ignore_GetVersionExW
     63#define GetEnvironmentStringsW                  Ignore_GetEnvironmentStringsW
     64#define FreeEnvironmentStringsW                 Ignore_FreeEnvironmentStringsW
     65#define GetLocaleInfoA                          Ignore_GetLocaleInfoA
     66#define EnumSystemLocalesA                      Ignore_EnumSystemLocalesA
     67#define IsValidLocale                           Ignore_IsValidLocale
     68#define SetThreadAffinityMask                   Ignore_SetThreadAffinityMask
     69#define GetProcessAffinityMask                  Ignore_GetProcessAffinityMask
     70#define CommandLineToArgvW                      Ignore_CommandLineToArgvW
    6171
    6272#include <iprt/nt/nt-and-windows.h>
     
    8191#undef IsDebuggerPresent
    8292#undef GetSystemTimeAsFileTime
    83 
    84 
     93#undef GetVersionExA
     94#undef GetVersionExW
     95#undef GetEnvironmentStringsW
     96#undef FreeEnvironmentStringsW
     97#undef GetLocaleInfoA
     98#undef EnumSystemLocalesA
     99#undef IsValidLocale
     100#undef SetThreadAffinityMask
     101#undef GetProcessAffinityMask
     102#undef CommandLineToArgvW
     103
     104
     105/*********************************************************************************************************************************
     106*   Defined Constants And Macros                                                                                                 *
     107*********************************************************************************************************************************/
    85108#ifndef HEAP_STANDARD
    86109# define HEAP_STANDARD 0
     
    118141
    119142
    120 extern "C"
    121 __declspec(dllexport) PVOID WINAPI
    122 DecodePointer(PVOID pvEncoded)
     143/** Declare a kernel32 API.
     144 * @note We are not exporting them as that causes duplicate symbol troubles in
     145 *       the OpenGL bits. */
     146#define DECL_KERNEL32(a_Type) extern "C" a_Type WINAPI
     147
     148
     149/*********************************************************************************************************************************
     150*   Internal Functions                                                                                                           *
     151*********************************************************************************************************************************/
     152DECL_KERNEL32(BOOL) WINAPI GetVersionExA(LPOSVERSIONINFOA pInfo);
     153
     154
     155DECL_KERNEL32(PVOID) DecodePointer(PVOID pvEncoded)
    123156{
    124157    RESOLVE_ME(DecodePointer);
     
    133166
    134167
    135 extern "C"
    136 __declspec(dllexport) PVOID WINAPI
    137 EncodePointer(PVOID pvNative)
     168DECL_KERNEL32(PVOID) EncodePointer(PVOID pvNative)
    138169{
    139170    RESOLVE_ME(EncodePointer);
     
    148179
    149180
    150 extern "C"
    151 __declspec(dllexport) BOOL WINAPI
    152 InitializeCriticalSectionAndSpinCount(LPCRITICAL_SECTION pCritSect, DWORD cSpin)
     181DECL_KERNEL32(BOOL) InitializeCriticalSectionAndSpinCount(LPCRITICAL_SECTION pCritSect, DWORD cSpin)
    153182{
    154183    RESOLVE_ME(InitializeCriticalSectionAndSpinCount);
     
    164193
    165194
    166 extern "C"
    167 __declspec(dllexport) BOOL WINAPI
    168 HeapSetInformation(HANDLE hHeap, HEAP_INFORMATION_CLASS enmInfoClass, PVOID pvBuf, SIZE_T cbBuf)
     195DECL_KERNEL32(BOOL) HeapSetInformation(HANDLE hHeap, HEAP_INFORMATION_CLASS enmInfoClass, PVOID pvBuf, SIZE_T cbBuf)
    169196{
    170197    RESOLVE_ME(HeapSetInformation);
     
    193220
    194221
    195 extern "C"
    196 __declspec(dllexport) BOOL WINAPI
    197 HeapQueryInformation(HANDLE hHeap, HEAP_INFORMATION_CLASS enmInfoClass, PVOID pvBuf, SIZE_T cbBuf, PSIZE_T pcbRet)
     222DECL_KERNEL32(BOOL) HeapQueryInformation(HANDLE hHeap, HEAP_INFORMATION_CLASS enmInfoClass,
     223                                         PVOID pvBuf, SIZE_T cbBuf, PSIZE_T pcbRet)
    198224{
    199225    RESOLVE_ME(HeapQueryInformation);
     
    223249/* These are used by INTEL\mt_obj\Timer.obj: */
    224250
    225 extern "C"
    226 __declspec(dllexport)
    227 HANDLE WINAPI CreateTimerQueue(void)
     251DECL_KERNEL32(HANDLE) CreateTimerQueue(void)
    228252{
    229253    RESOLVE_ME(CreateTimerQueue);
     
    234258}
    235259
    236 extern "C"
    237 __declspec(dllexport)
    238 BOOL WINAPI CreateTimerQueueTimer(PHANDLE phTimer, HANDLE hTimerQueue, WAITORTIMERCALLBACK pfnCallback, PVOID pvUser,
    239                                   DWORD msDueTime, DWORD msPeriod, ULONG fFlags)
     260DECL_KERNEL32(BOOL) CreateTimerQueueTimer(PHANDLE phTimer, HANDLE hTimerQueue, WAITORTIMERCALLBACK pfnCallback, PVOID pvUser,
     261                                          DWORD msDueTime, DWORD msPeriod, ULONG fFlags)
    240262{
    241263    RESOLVE_ME(CreateTimerQueueTimer);
     
    246268}
    247269
    248 extern "C"
    249 __declspec(dllexport)
    250 BOOL WINAPI DeleteTimerQueueTimer(HANDLE hTimerQueue, HANDLE hTimer, HANDLE hEvtCompletion)
     270DECL_KERNEL32(BOOL) DeleteTimerQueueTimer(HANDLE hTimerQueue, HANDLE hTimer, HANDLE hEvtCompletion)
    251271{
    252272    RESOLVE_ME(DeleteTimerQueueTimer);
     
    259279/* This is used by several APIs. */
    260280
    261 extern "C"
    262 __declspec(dllexport)
    263 VOID WINAPI InitializeSListHead(PSLIST_HEADER pHead)
     281DECL_KERNEL32(VOID) InitializeSListHead(PSLIST_HEADER pHead)
    264282{
    265283    RESOLVE_ME(InitializeSListHead);
     
    271289
    272290
    273 extern "C"
    274 __declspec(dllexport)
    275 PSLIST_ENTRY WINAPI InterlockedFlushSList(PSLIST_HEADER pHead)
     291DECL_KERNEL32(PSLIST_ENTRY) InterlockedFlushSList(PSLIST_HEADER pHead)
    276292{
    277293    RESOLVE_ME(InterlockedFlushSList);
     
    299315}
    300316
    301 extern "C"
    302 __declspec(dllexport)
    303 PSLIST_ENTRY WINAPI InterlockedPopEntrySList(PSLIST_HEADER pHead)
     317DECL_KERNEL32(PSLIST_ENTRY) InterlockedPopEntrySList(PSLIST_HEADER pHead)
    304318{
    305319    RESOLVE_ME(InterlockedPopEntrySList);
     
    335349}
    336350
    337 extern "C"
    338 __declspec(dllexport)
    339 PSLIST_ENTRY WINAPI InterlockedPushEntrySList(PSLIST_HEADER pHead, PSLIST_ENTRY pEntry)
     351DECL_KERNEL32(PSLIST_ENTRY) InterlockedPushEntrySList(PSLIST_HEADER pHead, PSLIST_ENTRY pEntry)
    340352{
    341353    RESOLVE_ME(InterlockedPushEntrySList);
     
    360372}
    361373
    362 extern "C"
    363 __declspec(dllexport)
    364 WORD WINAPI QueryDepthSList(PSLIST_HEADER pHead)
     374DECL_KERNEL32(WORD) QueryDepthSList(PSLIST_HEADER pHead)
    365375{
    366376    RESOLVE_ME(QueryDepthSList);
     
    372382
    373383/* curl drags these in: */
    374 extern "C"
    375 __declspec(dllexport)
    376 BOOL WINAPI VerifyVersionInfoA(LPOSVERSIONINFOEXA pInfo, DWORD fTypeMask, DWORDLONG fConditionMask)
     384DECL_KERNEL32(BOOL) VerifyVersionInfoA(LPOSVERSIONINFOEXA pInfo, DWORD fTypeMask, DWORDLONG fConditionMask)
    377385{
    378386    RESOLVE_ME(VerifyVersionInfoA);
     
    384392    RT_ZERO(VerInfo);
    385393    VerInfo.dwOSVersionInfoSize = sizeof(VerInfo);
    386     if (!GetVersionEx((OSVERSIONINFO *)&VerInfo))
     394    if (!GetVersionExA((OSVERSIONINFO *)&VerInfo))
    387395    {
    388396        RT_ZERO(VerInfo);
    389397        VerInfo.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);
    390         AssertReturn(GetVersionEx((OSVERSIONINFO *)&VerInfo), FALSE);
     398        AssertReturn(GetVersionExA((OSVERSIONINFO *)&VerInfo), FALSE);
    391399    }
    392400
     
    427435
    428436
    429 extern "C"
    430 __declspec(dllexport)
    431 ULONGLONG WINAPI VerSetConditionMask(ULONGLONG fConditionMask, DWORD fTypeMask, BYTE bOperator)
     437DECL_KERNEL32(ULONGLONG) VerSetConditionMask(ULONGLONG fConditionMask, DWORD fTypeMask, BYTE bOperator)
    432438{
    433439    RESOLVE_ME(VerSetConditionMask);
     
    452458 */
    453459
    454 extern "C" DECLEXPORT(BOOL) WINAPI IsProcessorFeaturePresent(DWORD enmProcessorFeature)
     460DECL_KERNEL32(BOOL) IsProcessorFeaturePresent(DWORD enmProcessorFeature)
    455461{
    456462    RESOLVE_ME(IsProcessorFeaturePresent);
     
    463469
    464470
    465 extern "C" DECLEXPORT(BOOL) WINAPI CancelIo(HANDLE hHandle)
     471DECL_KERNEL32(BOOL) CancelIo(HANDLE hHandle)
    466472{
    467473    RESOLVE_ME(CancelIo);
     
    492498 */
    493499
    494 extern "C" DECLEXPORT(BOOL) WINAPI IsDebuggerPresent(VOID)
     500DECL_KERNEL32(BOOL) IsDebuggerPresent(VOID)
    495501{
    496502    RESOLVE_ME(IsDebuggerPresent);
     
    501507
    502508
    503 extern "C" DECLEXPORT(VOID) WINAPI GetSystemTimeAsFileTime(LPFILETIME pTime)
     509DECL_KERNEL32(VOID) GetSystemTimeAsFileTime(LPFILETIME pTime)
    504510{
    505511    RESOLVE_ME(GetSystemTimeAsFileTime);
     
    528534        else
    529535        {
    530             /** @todo    */
    531             __debugbreak();
    532         }
    533     }
     536            /* NT 3.1 didn't have a KUSER_SHARED_DATA nor a GetSystemTimeAsFileTime export. */
     537            SYSTEMTIME SystemTime;
     538            GetSystemTime(&SystemTime);
     539            BOOL fRet = SystemTimeToFileTime(&SystemTime, pTime);
     540            AssertStmt(fRet, pTime->dwHighDateTime = pTime->dwLowDateTime = 0);
     541        }
     542    }
     543}
     544
     545
     546/*
     547 * NT 3.1 stuff.
     548 */
     549
     550DECL_KERNEL32(BOOL) GetVersionExA(LPOSVERSIONINFOA pInfo)
     551{
     552    RESOLVE_ME(GetVersionExA);
     553    if (pfnApi)
     554        return pfnApi(pInfo);
     555
     556    DWORD dwVersion = GetVersion();
     557
     558    /* Common fields: */
     559    pInfo->dwMajorVersion = dwVersion & 0xff;
     560    pInfo->dwMinorVersion = (dwVersion >> 8) & 0xff;
     561    if (!(dwVersion & RT_BIT_32(31)))
     562        pInfo->dwBuildNumber = dwVersion >> 16;
     563    else
     564        pInfo->dwBuildNumber = 511;
     565    pInfo->dwPlatformId = VER_PLATFORM_WIN32_NT;
     566/** @todo get CSD from registry. */
     567    pInfo->szCSDVersion[0] = '\0';
     568
     569    /* OSVERSIONINFOEX fields: */
     570    if (pInfo->dwOSVersionInfoSize > sizeof((*pInfo)))
     571    {
     572        LPOSVERSIONINFOEXA pInfoEx = (LPOSVERSIONINFOEXA)pInfo;
     573        if (pInfoEx->dwOSVersionInfoSize > RT_UOFFSETOF(OSVERSIONINFOEXA, wServicePackMinor))
     574        {
     575            pInfoEx->wServicePackMajor = 0;
     576            pInfoEx->wServicePackMinor = 0;
     577        }
     578        if (pInfoEx->dwOSVersionInfoSize > RT_UOFFSETOF(OSVERSIONINFOEXA, wSuiteMask))
     579            pInfoEx->wSuiteMask = 0;
     580        if (pInfoEx->dwOSVersionInfoSize > RT_UOFFSETOF(OSVERSIONINFOEXA, wProductType))
     581            pInfoEx->wProductType = VER_NT_WORKSTATION;
     582        if (pInfoEx->wReserved > RT_UOFFSETOF(OSVERSIONINFOEXA, wProductType))
     583            pInfoEx->wReserved = 0;
     584    }
     585
     586    return TRUE;
     587}
     588
     589
     590DECL_KERNEL32(BOOL) GetVersionExW(LPOSVERSIONINFOW pInfo)
     591{
     592    RESOLVE_ME(GetVersionExW);
     593    if (pfnApi)
     594        return pfnApi(pInfo);
     595
     596    DWORD dwVersion = GetVersion();
     597
     598    /* Common fields: */
     599    pInfo->dwMajorVersion = dwVersion & 0xff;
     600    pInfo->dwMinorVersion = (dwVersion >> 8) & 0xff;
     601    if (!(dwVersion & RT_BIT_32(31)))
     602        pInfo->dwBuildNumber = dwVersion >> 16;
     603    else
     604        pInfo->dwBuildNumber = 511;
     605    pInfo->dwPlatformId = VER_PLATFORM_WIN32_NT;
     606/** @todo get CSD from registry. */
     607    pInfo->szCSDVersion[0] = '\0';
     608
     609    /* OSVERSIONINFOEX fields: */
     610    if (pInfo->dwOSVersionInfoSize > sizeof((*pInfo)))
     611    {
     612        LPOSVERSIONINFOEXW pInfoEx = (LPOSVERSIONINFOEXW)pInfo;
     613        if (pInfoEx->dwOSVersionInfoSize > RT_UOFFSETOF(OSVERSIONINFOEXW, wServicePackMinor))
     614        {
     615            pInfoEx->wServicePackMajor = 0;
     616            pInfoEx->wServicePackMinor = 0;
     617        }
     618        if (pInfoEx->dwOSVersionInfoSize > RT_UOFFSETOF(OSVERSIONINFOEXW, wSuiteMask))
     619            pInfoEx->wSuiteMask = 0;
     620        if (pInfoEx->dwOSVersionInfoSize > RT_UOFFSETOF(OSVERSIONINFOEXW, wProductType))
     621            pInfoEx->wProductType = VER_NT_WORKSTATION;
     622        if (pInfoEx->wReserved > RT_UOFFSETOF(OSVERSIONINFOEXW, wProductType))
     623            pInfoEx->wReserved = 0;
     624    }
     625
     626    return TRUE;
     627}
     628
     629
     630DECL_KERNEL32(LPWCH) GetEnvironmentStringsW(void)
     631{
     632    RESOLVE_ME(GetEnvironmentStringsW);
     633    if (pfnApi)
     634        return pfnApi();
     635
     636    /*
     637     * Environment is ANSI in NT 3.1. We should only be here for NT 3.1.
     638     * For now, don't try do a perfect job converting it, just do it.
     639     */
     640    char    *pszzEnv = (char *)RTNtCurrentPeb()->ProcessParameters->Environment;
     641    size_t   offEnv  = 0;
     642    while (pszzEnv[offEnv] != '\0')
     643    {
     644        size_t cchLen = strlen(&pszzEnv[offEnv]);
     645        offEnv += cchLen + 1;
     646    }
     647    size_t const cchEnv = offEnv + 1;
     648
     649    PRTUTF16 pwszzEnv = (PRTUTF16)HeapAlloc(GetProcessHeap(), 0, cchEnv * sizeof(RTUTF16));
     650    if (!pwszzEnv)
     651        return NULL;
     652    for (offEnv = 0; offEnv < cchEnv; offEnv++)
     653    {
     654        unsigned char ch = pwszzEnv[offEnv];
     655        if (!(ch & 0x80))
     656            pwszzEnv[offEnv] = ch;
     657        else
     658            pwszzEnv[offEnv] = '_';
     659    }
     660    return pwszzEnv;
     661}
     662
     663
     664DECL_KERNEL32(BOOL) FreeEnvironmentStringsW(LPWCH pwszzEnv)
     665{
     666    RESOLVE_ME(FreeEnvironmentStringsW);
     667    if (pfnApi)
     668        return pfnApi(pwszzEnv);
     669    if (pwszzEnv)
     670        HeapFree(GetProcessHeap(), 0, pwszzEnv);
     671    return TRUE;
     672}
     673
     674
     675DECL_KERNEL32(int) GetLocaleInfoA(LCID idLocale, LCTYPE enmType, LPSTR pData, int cchData)
     676{
     677    RESOLVE_ME(GetLocaleInfoA);
     678    if (pfnApi)
     679        return pfnApi(idLocale, enmType, pData, cchData);
     680
     681    AssertMsgFailed(("GetLocaleInfoA: idLocale=%#x enmType=%#x cchData=%#x\n", idLocale, enmType, cchData));
     682    SetLastError(ERROR_NOT_SUPPORTED);
     683    return 0;
     684}
     685
     686
     687DECL_KERNEL32(BOOL) EnumSystemLocalesA(LOCALE_ENUMPROCA pfnCallback, DWORD fFlags)
     688{
     689    RESOLVE_ME(EnumSystemLocalesA);
     690    if (pfnApi)
     691        return pfnApi(pfnCallback, fFlags);
     692
     693    AssertMsgFailed(("EnumSystemLocalesA: pfnCallback=%p fFlags=%#x\n", pfnCallback, fFlags));
     694    SetLastError(ERROR_NOT_SUPPORTED);
     695    return FALSE;
     696}
     697
     698
     699DECL_KERNEL32(BOOL) IsValidLocale(LCID idLocale, DWORD fFlags)
     700{
     701    RESOLVE_ME(IsValidLocale);
     702    if (pfnApi)
     703        return pfnApi(idLocale, fFlags);
     704
     705    AssertMsgFailed(("IsValidLocale: idLocale fFlags=%#x\n", idLocale, fFlags));
     706    SetLastError(ERROR_NOT_SUPPORTED);
     707    return FALSE;
     708}
     709
     710
     711DECL_KERNEL32(DWORD_PTR) SetThreadAffinityMask(HANDLE hThread, DWORD_PTR fAffinityMask)
     712{
     713    RESOLVE_ME(SetThreadAffinityMask);
     714    if (pfnApi)
     715        return pfnApi(hThread, fAffinityMask);
     716
     717    SYSTEM_INFO SysInfo;
     718    GetSystemInfo(&SysInfo);
     719    AssertMsgFailed(("SetThreadAffinityMask: hThread=%p fAffinityMask=%p SysInfo.dwActiveProcessorMask=%p\n",
     720                     hThread, fAffinityMask, SysInfo.dwActiveProcessorMask));
     721    if (   SysInfo.dwActiveProcessorMask == fAffinityMask
     722        || fAffinityMask                 == ~(DWORD_PTR)0)
     723        return fAffinityMask;
     724
     725    SetLastError(ERROR_NOT_SUPPORTED);
     726    return 0;
     727}
     728
     729
     730DECL_KERNEL32(BOOL) GetProcessAffinityMask(HANDLE hProcess, PDWORD_PTR pfProcessAffinityMask, PDWORD_PTR pfSystemAffinityMask)
     731{
     732    RESOLVE_ME(GetProcessAffinityMask);
     733    if (pfnApi)
     734        return pfnApi(hProcess, pfProcessAffinityMask, pfSystemAffinityMask);
     735
     736    SYSTEM_INFO SysInfo;
     737    GetSystemInfo(&SysInfo);
     738    AssertMsgFailed(("GetProcessAffinityMask: SysInfo.dwActiveProcessorMask=%p\n", SysInfo.dwActiveProcessorMask));
     739    if (pfProcessAffinityMask)
     740        *pfProcessAffinityMask = SysInfo.dwActiveProcessorMask;
     741    if (pfSystemAffinityMask)
     742        *pfSystemAffinityMask  = SysInfo.dwActiveProcessorMask;
     743    return TRUE;
     744}
     745
     746
     747/** @todo This is actually in SHELL32. */
     748DECL_KERNEL32(LPWSTR *) CommandLineToArgvW(LPCWSTR pwszCmdLine, int *pcArgs)
     749{
     750    RESOLVE_ME(CommandLineToArgvW);
     751    if (pfnApi)
     752        return pfnApi(pwszCmdLine, pcArgs);
     753
     754    *pcArgs = 0;
     755    return NULL;
    534756}
    535757
  • trunk/src/VBox/Runtime/r3/win/vcc100-kernel32-fakesA.asm

    r70213 r70341  
    4545GLOBALNAME vcc100_kernel32_fakes_asm
    4646
     47; NT 4
    4748MAKE_IMPORT_ENTRY DecodePointer, 4
    4849MAKE_IMPORT_ENTRY EncodePointer, 4
     
    6061MAKE_IMPORT_ENTRY VerifyVersionInfoA, 16
    6162MAKE_IMPORT_ENTRY VerSetConditionMask, 16
     63; NT 3.51
    6264MAKE_IMPORT_ENTRY IsProcessorFeaturePresent, 4
    6365MAKE_IMPORT_ENTRY CancelIo, 4
     66; NT 3.50
    6467MAKE_IMPORT_ENTRY IsDebuggerPresent, 0
    6568MAKE_IMPORT_ENTRY GetSystemTimeAsFileTime, 4
     69; NT 3.1
     70MAKE_IMPORT_ENTRY GetVersionExA, 4
     71MAKE_IMPORT_ENTRY GetVersionExW, 4
     72MAKE_IMPORT_ENTRY GetEnvironmentStringsW, 0
     73MAKE_IMPORT_ENTRY FreeEnvironmentStringsW, 4
     74MAKE_IMPORT_ENTRY GetLocaleInfoA, 16
     75MAKE_IMPORT_ENTRY EnumSystemLocalesA, 8
     76MAKE_IMPORT_ENTRY IsValidLocale, 8
     77MAKE_IMPORT_ENTRY SetThreadAffinityMask, 8
     78MAKE_IMPORT_ENTRY GetProcessAffinityMask, 12
     79MAKE_IMPORT_ENTRY CommandLineToArgvW, 8 ; Lazy bird: this lives in shell32.
    6680
Note: See TracChangeset for help on using the changeset viewer.

© 2025 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette