mirror of
https://github.com/reactos/reactos.git
synced 2024-12-28 01:55:19 +00:00
[NTVDM] Retrieve the full directory of the current running NTVDM instance, to be used as a base path for opening other NTVDM system files.
This commit is contained in:
parent
86eebc2a31
commit
1bd0e3f9f9
2 changed files with 60 additions and 2 deletions
|
@ -31,6 +31,10 @@ NTVDM_SETTINGS GlobalSettings;
|
||||||
INT NtVdmArgc;
|
INT NtVdmArgc;
|
||||||
WCHAR** NtVdmArgv;
|
WCHAR** NtVdmArgv;
|
||||||
|
|
||||||
|
/* Full directory where NTVDM resides, or the SystemRoot\System32 path */
|
||||||
|
WCHAR NtVdmPath[MAX_PATH];
|
||||||
|
ULONG NtVdmPathSize; // Length without NULL terminator.
|
||||||
|
|
||||||
/* PRIVATE FUNCTIONS **********************************************************/
|
/* PRIVATE FUNCTIONS **********************************************************/
|
||||||
|
|
||||||
static NTSTATUS
|
static NTSTATUS
|
||||||
|
@ -476,6 +480,8 @@ PrintMessageAnsi(IN CHAR_PRINT CharPrint,
|
||||||
INT
|
INT
|
||||||
wmain(INT argc, WCHAR *argv[])
|
wmain(INT argc, WCHAR *argv[])
|
||||||
{
|
{
|
||||||
|
BOOL Success;
|
||||||
|
|
||||||
#ifdef STANDALONE
|
#ifdef STANDALONE
|
||||||
|
|
||||||
if (argc < 2)
|
if (argc < 2)
|
||||||
|
@ -531,20 +537,62 @@ wmain(INT argc, WCHAR *argv[])
|
||||||
"\n\n",
|
"\n\n",
|
||||||
GetCommandLineA());
|
GetCommandLineA());
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Retrieve the full directory of the current running NTVDM instance.
|
||||||
|
* In case of failure, use the default SystemRoot\System32 path.
|
||||||
|
*/
|
||||||
|
NtVdmPathSize = GetModuleFileNameW(NULL, NtVdmPath, _countof(NtVdmPath));
|
||||||
|
NtVdmPath[_countof(NtVdmPath) - 1] = UNICODE_NULL; // Ensure NULL-termination (see WinXP bug)
|
||||||
|
|
||||||
|
Success = ((NtVdmPathSize != 0) && (NtVdmPathSize < _countof(NtVdmPath)) &&
|
||||||
|
(GetLastError() != ERROR_INSUFFICIENT_BUFFER));
|
||||||
|
if (Success)
|
||||||
|
{
|
||||||
|
/* Find the last path separator, remove it as well as the file name */
|
||||||
|
PWCHAR pch = wcsrchr(NtVdmPath, L'\\');
|
||||||
|
if (pch)
|
||||||
|
*pch = UNICODE_NULL;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
/* We failed, use the default SystemRoot\System32 path */
|
||||||
|
NtVdmPathSize = GetSystemDirectoryW(NtVdmPath, _countof(NtVdmPath));
|
||||||
|
Success = ((NtVdmPathSize != 0) && (NtVdmPathSize < _countof(NtVdmPath)));
|
||||||
|
if (!Success)
|
||||||
|
{
|
||||||
|
/* We failed again, try to do it ourselves */
|
||||||
|
NtVdmPathSize = (ULONG)wcslen(SharedUserData->NtSystemRoot) + _countof("\\System32") - 1;
|
||||||
|
Success = (NtVdmPathSize < _countof(NtVdmPath));
|
||||||
|
if (Success)
|
||||||
|
{
|
||||||
|
Success = NT_SUCCESS(RtlStringCchPrintfW(NtVdmPath,
|
||||||
|
_countof(NtVdmPath),
|
||||||
|
L"%s\\System32",
|
||||||
|
SharedUserData->NtSystemRoot));
|
||||||
|
}
|
||||||
|
if (!Success)
|
||||||
|
{
|
||||||
|
wprintf(L"FATAL: Could not retrieve NTVDM path.\n");
|
||||||
|
goto Cleanup;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
NtVdmPathSize = (ULONG)wcslen(NtVdmPath);
|
||||||
|
|
||||||
/* Load the global VDM settings */
|
/* Load the global VDM settings */
|
||||||
LoadGlobalSettings(&GlobalSettings);
|
LoadGlobalSettings(&GlobalSettings);
|
||||||
|
|
||||||
/* Initialize the console */
|
/* Initialize the console */
|
||||||
if (!ConsoleInit())
|
if (!ConsoleInit())
|
||||||
{
|
{
|
||||||
wprintf(L"FATAL: A problem occurred when trying to initialize the console\n");
|
wprintf(L"FATAL: A problem occurred when trying to initialize the console.\n");
|
||||||
goto Cleanup;
|
goto Cleanup;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Initialize the emulator */
|
/* Initialize the emulator */
|
||||||
if (!EmulatorInitialize(ConsoleInput, ConsoleOutput))
|
if (!EmulatorInitialize(ConsoleInput, ConsoleOutput))
|
||||||
{
|
{
|
||||||
wprintf(L"FATAL: Failed to initialize the emulator\n");
|
wprintf(L"FATAL: Failed to initialize the emulator.\n");
|
||||||
goto Cleanup;
|
goto Cleanup;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -40,6 +40,10 @@
|
||||||
#include <stdarg.h>
|
#include <stdarg.h>
|
||||||
#include <wchar.h>
|
#include <wchar.h>
|
||||||
|
|
||||||
|
#ifndef _countof
|
||||||
|
#define _countof(_Array) (sizeof(_Array) / sizeof(_Array[0]))
|
||||||
|
#endif
|
||||||
|
|
||||||
/* PSDK/NDK Headers */
|
/* PSDK/NDK Headers */
|
||||||
#define WIN32_NO_STATUS
|
#define WIN32_NO_STATUS
|
||||||
#include <windef.h>
|
#include <windef.h>
|
||||||
|
@ -67,6 +71,8 @@ DWORD WINAPI SetLastConsoleEventActive(VOID);
|
||||||
/* PSEH for SEH Support */
|
/* PSEH for SEH Support */
|
||||||
#include <pseh/pseh2.h>
|
#include <pseh/pseh2.h>
|
||||||
|
|
||||||
|
#include <ntstrsafe.h>
|
||||||
|
|
||||||
|
|
||||||
/* VARIABLES ******************************************************************/
|
/* VARIABLES ******************************************************************/
|
||||||
|
|
||||||
|
@ -84,6 +90,10 @@ extern NTVDM_SETTINGS GlobalSettings;
|
||||||
extern INT NtVdmArgc;
|
extern INT NtVdmArgc;
|
||||||
extern WCHAR** NtVdmArgv;
|
extern WCHAR** NtVdmArgv;
|
||||||
|
|
||||||
|
/* Full directory where NTVDM resides, or the SystemRoot\System32 path */
|
||||||
|
extern WCHAR NtVdmPath[MAX_PATH];
|
||||||
|
extern ULONG NtVdmPathSize; // Length without NULL terminator.
|
||||||
|
|
||||||
extern HWND hConsoleWnd;
|
extern HWND hConsoleWnd;
|
||||||
|
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue