Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Implement some functions needed for cmd.exe to work #26

Merged
merged 2 commits into from
Apr 13, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
10 changes: 5 additions & 5 deletions COREDLL/Exports.def
Original file line number Diff line number Diff line change
Expand Up @@ -21,8 +21,8 @@ EXPORTS
FindNextFileW=FindNextFileW_WCECL @181
FindFirstFileW=FindFirstFileW_WCECL @167
WaitForAPIReady @2562
SetStdioPathW @1150
GetStdioPathW @1149
SetStdioPathW=SetStdioPathW_WCECL @1150
GetStdioPathW=GetStdioPathW_WCECL @1149
DeviceIoControl=DeviceIoControl_WCECL @179
_wfopen @1145
fread @1120
Expand All @@ -31,7 +31,7 @@ EXPORTS
_wcsupr @232
vfwprintf=vfwprintf_WCECL @721
fflush @1122
fgetws @1143
fgetws=fgetws_WCECL @1143
fputwc @1141
fputws @1144
_getstdfilex=_getstdfilex_WCECL @1100
Expand Down Expand Up @@ -133,7 +133,7 @@ EXPORTS
towlower @194
towupper @195
MultiByteToWideChar @196
WideCharToMultiByte @197
WideCharToMultiByte=WideCharToMultiByte_WCECL @197
CompareStringW @198
LCMapStringW @199
SetLocaleInfoW @201
Expand Down Expand Up @@ -398,7 +398,7 @@ EXPORTS
qsort @1052
rand @1053
realloc @1054
_fileno @1124
_fileno=_fileno_WCECL @1124
feof @1125
ferror @1126
clearerr @1127
Expand Down
115 changes: 103 additions & 12 deletions COREDLL/other.cpp
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
// other.cpp : contains unknown for me and other weird functions )
#include "stdafx.h"
#include <io.h>

// Functions
HANDLE GetOwnerProcess_WCECL()
Expand Down Expand Up @@ -83,11 +84,11 @@ LCID WINAPI ConvertDefaultLocale_WCECL(LCID Locale)
int _snwprintf_WCECL(wchar_t * buf, size_t bufCount, const wchar_t * fmt, ...)
{
#pragma warning( push )
#pragma warning( disable: 4995 )
#pragma warning( disable: 4995 4996)
va_list args;
va_start(args, fmt);

auto result = _snwprintf(buf, bufCount, fmt, args);
auto result = _vsnwprintf(buf, bufCount, fmt, args);

va_end(args);

Expand All @@ -99,11 +100,11 @@ int _snwprintf_WCECL(wchar_t * buf, size_t bufCount, const wchar_t * fmt, ...)
int __cdecl swscanf_WCECL(const wchar_t * buf, const wchar_t * fmt, ...)
{
#pragma warning( push )
#pragma warning( disable: 4995 )
#pragma warning( disable: 4995 4996 )
va_list args;
va_start(args, fmt);

auto result = swscanf(buf, fmt, args);
auto result = vswscanf(buf, fmt, args);

va_end(args);
#pragma warning( pop )
Expand All @@ -114,11 +115,11 @@ int __cdecl swscanf_WCECL(const wchar_t * buf, const wchar_t * fmt, ...)
int swprintf_WCECL(wchar_t * buf, const wchar_t * _format, ...)
{
#pragma warning( push )
#pragma warning( disable: 4995 )
#pragma warning( disable: 4995 4996 )
va_list args;
va_start(args, _format);

auto result = swprintf(buf, _format, args);
auto result = vswprintf(buf, _format, args);

va_end(args);
#pragma warning( pop )
Expand All @@ -130,11 +131,11 @@ int swprintf_WCECL(wchar_t * buf, const wchar_t * _format, ...)
int sprintf_WCECL(char* buffer, const char* format, ...)
{
#pragma warning( push )
#pragma warning( disable: 4995 )
#pragma warning( disable: 4995 4996 )
va_list args;
va_start(args, format);

auto result = sprintf(buffer, format, args);
auto result = vsprintf(buffer, format, args);

va_end(args);
#pragma warning( pop )
Expand Down Expand Up @@ -193,12 +194,102 @@ void CeLogSetZones(DWORD dwZoneUser, // User-defined zones
// wtf!?
}

FILE* WINAPI _getstdfilex_WCECL(DWORD type)
{
switch (type)
{
case 0:
return stdin;
case 1:
return stdout;
case 2:
return stderr;
default:
Assert32(FALSE);
return NULL;
}
}

BOOL WINAPI SetStdioPathW_WCECL(
DWORD id,
PWSTR pwszPath)
{
/* TODO: test */
switch (id)
{
case 0:
return (_wfreopen(pwszPath, L"r", stdin) != NULL);
case 1:
return (_wfreopen(pwszPath, L"w", stdout) != NULL);
case 2:
return (_wfreopen(pwszPath, L"w", stderr) != NULL);
default:
Assert32(FALSE);
return NULL;
}
}

BOOL WINAPI GetStdioPathW_WCECL(
DWORD id,
PWSTR pwszBuf,
LPDWORD lpdwLen)
{
/* TODO: test */
FILE* filePtr = _getstdfilex_WCECL(id);
HANDLE hFile = (HANDLE)_get_osfhandle(_fileno(filePtr));
if (GetFinalPathNameByHandleW(hFile, pwszBuf, *lpdwLen, 0) < *lpdwLen)
{
return TRUE;
}

return FALSE;
}

void* _fileno_WCECL(FILE* file)
{
return (void*)_get_osfhandle(_fileno(file));
}

int WINAPI WideCharToMultiByte_WCECL(
UINT CodePage,
DWORD dwFlags,
LPCWSTR lpWideCharStr,
int cchWideChar,
LPSTR lpMultiByteStr,
int cbMultiByte,
LPCSTR lpDefaultChar,
LPBOOL lpUsedDefaultChar)
{
return WideCharToMultiByte(
CodePage,
dwFlags,
lpWideCharStr,
cchWideChar,
lpMultiByteStr,
cbMultiByte,
lpDefaultChar,
lpUsedDefaultChar);
}

wchar_t* fgetws_WCECL(wchar_t* w, int count, FILE* file)
{
wchar_t* result = fgetws(w, count, file);
if (result == NULL &&
file == stdin && count > 2)
{
result = w;
wsprintf(w, L"");
}
else
{
return result;
}
return result;
}

// Stubs
Stub(_chkstk_WCECL);
Stub(WaitForAPIReady)
Stub(SetStdioPathW);
Stub(GetStdioPathW);
Stub(_getstdfilex_WCECL); // FILE* __cdecl _getstdfilex_WCECL(int a1)
Stub(WaitForAPIReady);
Stub(RegisterDefaultGestureHandler_WCECL);
Stub(CloseGestureInfoHandle_WCECL);
Stub(GetGestureExtraArguments_WCECL);
Expand Down
12 changes: 12 additions & 0 deletions COREDLL/stdafx.h
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,18 @@ typedef struct tagWNDCLASSW_WCECL {
LPCWSTR lpszClassName;
} WNDCLASSW_WCECL, *PWNDCLASSW_WCECL, *LPWNDCLASSW_WCECL;

typedef struct tagWIN32_FIND_DATA_WCECL
{
DWORD dwFileAttributes;
FILETIME ftCreationTime;
FILETIME ftLastAccessTime;
FILETIME ftLastWriteTime;
DWORD nFileSizeHigh;
DWORD nFileSizeLow;
DWORD dwOID;
TCHAR cFileName[MAX_PATH];
} WIN32_FIND_DATA_WCECL, *PWIN32_FIND_DATA_WCECL, *LPWIN32_FIND_DATA_WCECL;

// MACROS
#undef RasHangUp
#undef RasDial
Expand Down
47 changes: 43 additions & 4 deletions COREDLL/winbase_wcecl.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -367,20 +367,59 @@ BOOL WINAPI DeleteFileW_WCECL(LPCWSTR lpFileName)
auto result = DeleteFileW(lpFileName);
return result;
}
static void ConvertFindDataToWcecl(
LPWIN32_FIND_DATA_WCECL lpWceclData,
LPWIN32_FIND_DATAW lpFindData)
{
wcscpy_s(lpWceclData->cFileName,
sizeof(lpWceclData->cFileName) / sizeof(*lpWceclData->cFileName),
lpFindData->cFileName);
lpWceclData->dwFileAttributes = lpFindData->dwFileAttributes;
lpWceclData->dwOID = lpFindData->dwReserved0;
lpWceclData->ftCreationTime = lpFindData->ftCreationTime;
lpWceclData->ftLastAccessTime = lpFindData->ftLastAccessTime;
lpWceclData->ftLastWriteTime = lpFindData->ftLastWriteTime;
lpWceclData->nFileSizeHigh = lpFindData->nFileSizeHigh;
lpWceclData->nFileSizeLow = lpFindData->nFileSizeLow;
}

static void ConvertFindDataFromWcecl(
LPWIN32_FIND_DATAW lpFindData,
LPWIN32_FIND_DATA_WCECL lpWceclData)
{
wcscpy_s(lpFindData->cFileName,
sizeof(lpFindData->cFileName) / sizeof(*lpFindData->cFileName),
lpWceclData->cFileName);
lpFindData->dwFileAttributes = lpWceclData->dwFileAttributes;
lpFindData->dwReserved0 = lpWceclData->dwOID;
lpFindData->ftCreationTime = lpWceclData->ftCreationTime;
lpFindData->ftLastAccessTime = lpWceclData->ftLastAccessTime;
lpFindData->ftLastWriteTime = lpWceclData->ftLastWriteTime;
lpFindData->nFileSizeHigh = lpWceclData->nFileSizeHigh;
lpFindData->nFileSizeLow = lpWceclData->nFileSizeLow;
}

HANDLE WINAPI FindFirstFileW_WCECL(
LPCWSTR lpFileName,
LPWIN32_FIND_DATAW lpFindFileData)
LPWIN32_FIND_DATA_WCECL lpFindFileData)
{
auto result = FindFirstFileW(lpFileName, lpFindFileData);
WIN32_FIND_DATAW findData;

ConvertFindDataFromWcecl(&findData, lpFindFileData);
auto result = FindFirstFileW(lpFileName, &findData);
ConvertFindDataToWcecl(lpFindFileData, &findData);
return result;
}

BOOL WINAPI FindNextFileW_WCECL(
HANDLE hFindFile,
LPWIN32_FIND_DATAW lpFindFileData)
LPWIN32_FIND_DATA_WCECL lpFindFileData)
{
auto result = FindNextFileW(hFindFile, lpFindFileData);
WIN32_FIND_DATAW findData;

ConvertFindDataFromWcecl(&findData, lpFindFileData);
auto result = FindNextFileW(hFindFile, &findData);
ConvertFindDataToWcecl(lpFindFileData, &findData);
return result;
}

Expand Down