Added hack to fetch the current directory from the subsystem tid so
that it is handled correctly in ntdll also for 16-bit tasks.
This commit is contained in:
parent
bd1fdeddaa
commit
186b419e02
|
@ -21,23 +21,6 @@
|
||||||
#ifndef __WINE_KERNEL_PRIVATE_H
|
#ifndef __WINE_KERNEL_PRIVATE_H
|
||||||
#define __WINE_KERNEL_PRIVATE_H
|
#define __WINE_KERNEL_PRIVATE_H
|
||||||
|
|
||||||
#include <stdarg.h>
|
|
||||||
#include "windef.h"
|
|
||||||
#include "winbase.h"
|
|
||||||
#include "winreg.h"
|
|
||||||
#include "winternl.h"
|
|
||||||
|
|
||||||
/* The thread information for 16-bit threads */
|
|
||||||
/* NtCurrentTeb()->SubSystemTib points to this */
|
|
||||||
typedef struct
|
|
||||||
{
|
|
||||||
void *unknown; /* 00 unknown */
|
|
||||||
UNICODE_STRING *exe_name; /* 04 exe module name */
|
|
||||||
|
|
||||||
/* the following fields do not exist under Windows */
|
|
||||||
UNICODE_STRING exe_str; /* exe name string pointed to by exe_name */
|
|
||||||
} WIN16_SUBSYSTEM_TIB;
|
|
||||||
|
|
||||||
HANDLE WINAPI OpenConsoleW(LPCWSTR, DWORD, BOOL, DWORD);
|
HANDLE WINAPI OpenConsoleW(LPCWSTR, DWORD, BOOL, DWORD);
|
||||||
BOOL WINAPI VerifyConsoleIoHandle(HANDLE);
|
BOOL WINAPI VerifyConsoleIoHandle(HANDLE);
|
||||||
HANDLE WINAPI DuplicateConsoleHandle(HANDLE, DWORD, BOOL, DWORD);
|
HANDLE WINAPI DuplicateConsoleHandle(HANDLE, DWORD, BOOL, DWORD);
|
||||||
|
|
|
@ -432,6 +432,7 @@ static WIN16_SUBSYSTEM_TIB *allocate_win16_tib( TDB *pTask )
|
||||||
{
|
{
|
||||||
WCHAR path[MAX_PATH];
|
WCHAR path[MAX_PATH];
|
||||||
WIN16_SUBSYSTEM_TIB *tib;
|
WIN16_SUBSYSTEM_TIB *tib;
|
||||||
|
UNICODE_STRING *curdir;
|
||||||
NE_MODULE *pModule = NE_GetPtr( pTask->hModule );
|
NE_MODULE *pModule = NE_GetPtr( pTask->hModule );
|
||||||
|
|
||||||
if (!(tib = HeapAlloc( GetProcessHeap(), 0, sizeof(*tib) ))) return NULL;
|
if (!(tib = HeapAlloc( GetProcessHeap(), 0, sizeof(*tib) ))) return NULL;
|
||||||
|
@ -439,6 +440,15 @@ static WIN16_SUBSYSTEM_TIB *allocate_win16_tib( TDB *pTask )
|
||||||
GetLongPathNameW( path, path, MAX_PATH );
|
GetLongPathNameW( path, path, MAX_PATH );
|
||||||
if (RtlCreateUnicodeString( &tib->exe_str, path )) tib->exe_name = &tib->exe_str;
|
if (RtlCreateUnicodeString( &tib->exe_str, path )) tib->exe_name = &tib->exe_str;
|
||||||
else tib->exe_name = NULL;
|
else tib->exe_name = NULL;
|
||||||
|
|
||||||
|
RtlAcquirePebLock();
|
||||||
|
curdir = &NtCurrentTeb()->Peb->ProcessParameters->CurrentDirectoryName;
|
||||||
|
tib->curdir.MaximumLength = sizeof(tib->curdir_buffer);
|
||||||
|
tib->curdir.Length = min( curdir->Length, tib->curdir.MaximumLength-sizeof(WCHAR) );
|
||||||
|
tib->curdir.Buffer = tib->curdir_buffer;
|
||||||
|
memcpy( tib->curdir_buffer, curdir->Buffer, tib->curdir.Length );
|
||||||
|
tib->curdir_buffer[tib->curdir.Length/sizeof(WCHAR)] = 0;
|
||||||
|
RtlReleasePebLock();
|
||||||
return tib;
|
return tib;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -518,6 +528,7 @@ static void TASK_CallTaskSignalProc( UINT16 uCode, HANDLE16 hTaskOrModule )
|
||||||
*/
|
*/
|
||||||
void TASK_ExitTask(void)
|
void TASK_ExitTask(void)
|
||||||
{
|
{
|
||||||
|
WIN16_SUBSYSTEM_TIB *tib;
|
||||||
TDB *pTask;
|
TDB *pTask;
|
||||||
DWORD lockCount;
|
DWORD lockCount;
|
||||||
|
|
||||||
|
@ -553,6 +564,13 @@ void TASK_ExitTask(void)
|
||||||
|
|
||||||
TASK_DeleteTask( pTask->hSelf );
|
TASK_DeleteTask( pTask->hSelf );
|
||||||
|
|
||||||
|
if ((tib = NtCurrentTeb()->Tib.SubSystemTib))
|
||||||
|
{
|
||||||
|
if (tib->exe_name) RtlFreeUnicodeString( tib->exe_name );
|
||||||
|
HeapFree( GetProcessHeap(), 0, tib );
|
||||||
|
NtCurrentTeb()->Tib.SubSystemTib = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
/* ... and completely release the Win16Lock, just in case. */
|
/* ... and completely release the Win16Lock, just in case. */
|
||||||
ReleaseThunkLock( &lockCount );
|
ReleaseThunkLock( &lockCount );
|
||||||
}
|
}
|
||||||
|
|
|
@ -541,6 +541,9 @@ static ULONG get_full_path_helper(LPCWSTR name, LPWSTR buffer, ULONG size)
|
||||||
|
|
||||||
RtlAcquirePebLock();
|
RtlAcquirePebLock();
|
||||||
|
|
||||||
|
if (NtCurrentTeb()->Tib.SubSystemTib) /* FIXME: hack */
|
||||||
|
cd = &((WIN16_SUBSYSTEM_TIB *)NtCurrentTeb()->Tib.SubSystemTib)->curdir;
|
||||||
|
else
|
||||||
cd = &NtCurrentTeb()->Peb->ProcessParameters->CurrentDirectoryName;
|
cd = &NtCurrentTeb()->Peb->ProcessParameters->CurrentDirectoryName;
|
||||||
|
|
||||||
switch (type = RtlDetermineDosPathNameType_U(name))
|
switch (type = RtlDetermineDosPathNameType_U(name))
|
||||||
|
@ -851,7 +854,11 @@ NTSTATUS WINAPI RtlGetCurrentDirectory_U(ULONG buflen, LPWSTR buf)
|
||||||
|
|
||||||
RtlAcquirePebLock();
|
RtlAcquirePebLock();
|
||||||
|
|
||||||
|
if (NtCurrentTeb()->Tib.SubSystemTib) /* FIXME: hack */
|
||||||
|
us = &((WIN16_SUBSYSTEM_TIB *)NtCurrentTeb()->Tib.SubSystemTib)->curdir;
|
||||||
|
else
|
||||||
us = &NtCurrentTeb()->Peb->ProcessParameters->CurrentDirectoryName;
|
us = &NtCurrentTeb()->Peb->ProcessParameters->CurrentDirectoryName;
|
||||||
|
|
||||||
len = us->Length / sizeof(WCHAR);
|
len = us->Length / sizeof(WCHAR);
|
||||||
if (us->Buffer[len - 1] == '\\' && us->Buffer[len - 2] != ':')
|
if (us->Buffer[len - 1] == '\\' && us->Buffer[len - 2] != ':')
|
||||||
len--;
|
len--;
|
||||||
|
@ -886,7 +893,11 @@ NTSTATUS WINAPI RtlSetCurrentDirectory_U(const UNICODE_STRING* dir)
|
||||||
|
|
||||||
RtlAcquirePebLock();
|
RtlAcquirePebLock();
|
||||||
|
|
||||||
|
if (NtCurrentTeb()->Tib.SubSystemTib) /* FIXME: hack */
|
||||||
|
curdir = &((WIN16_SUBSYSTEM_TIB *)NtCurrentTeb()->Tib.SubSystemTib)->curdir;
|
||||||
|
else
|
||||||
curdir = &NtCurrentTeb()->Peb->ProcessParameters->CurrentDirectoryName;
|
curdir = &NtCurrentTeb()->Peb->ProcessParameters->CurrentDirectoryName;
|
||||||
|
|
||||||
size = curdir->MaximumLength;
|
size = curdir->MaximumLength;
|
||||||
|
|
||||||
buf = RtlAllocateHeap(GetProcessHeap(), 0, size);
|
buf = RtlAllocateHeap(GetProcessHeap(), 0, size);
|
||||||
|
@ -929,24 +940,6 @@ NTSTATUS WINAPI RtlSetCurrentDirectory_U(const UNICODE_STRING* dir)
|
||||||
memmove(curdir->Buffer, buf, size + sizeof(WCHAR));
|
memmove(curdir->Buffer, buf, size + sizeof(WCHAR));
|
||||||
curdir->Length = size;
|
curdir->Length = size;
|
||||||
|
|
||||||
#if 0
|
|
||||||
if (curdir->Buffer[1] == ':')
|
|
||||||
{
|
|
||||||
UNICODE_STRING env;
|
|
||||||
WCHAR var[4];
|
|
||||||
|
|
||||||
var[0] = '=';
|
|
||||||
var[1] = curdir->Buffer[0];
|
|
||||||
var[2] = ':';
|
|
||||||
var[3] = 0;
|
|
||||||
env.Length = 3 * sizeof(WCHAR);
|
|
||||||
env.MaximumLength = 4 * sizeof(WCHAR);
|
|
||||||
env.Buffer = var;
|
|
||||||
|
|
||||||
RtlSetEnvironmentVariable(NULL, &env, curdir);
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
out:
|
out:
|
||||||
if (buf) RtlFreeHeap(GetProcessHeap(), 0, buf);
|
if (buf) RtlFreeHeap(GetProcessHeap(), 0, buf);
|
||||||
|
|
||||||
|
|
|
@ -133,6 +133,20 @@ typedef struct _TEB
|
||||||
} TEB;
|
} TEB;
|
||||||
#endif /* WINE_TEB_DEFINED */
|
#endif /* WINE_TEB_DEFINED */
|
||||||
|
|
||||||
|
|
||||||
|
/* The thread information for 16-bit threads */
|
||||||
|
/* NtCurrentTeb()->SubSystemTib points to this */
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
void *unknown; /* 00 unknown */
|
||||||
|
UNICODE_STRING *exe_name; /* 04 exe module name */
|
||||||
|
|
||||||
|
/* the following fields do not exist under Windows */
|
||||||
|
UNICODE_STRING exe_str; /* exe name string pointed to by exe_name */
|
||||||
|
UNICODE_STRING curdir; /* current directory */
|
||||||
|
WCHAR curdir_buffer[MAX_PATH];
|
||||||
|
} WIN16_SUBSYSTEM_TIB;
|
||||||
|
|
||||||
/* scheduler/thread.c */
|
/* scheduler/thread.c */
|
||||||
extern TEB *THREAD_InitStack( TEB *teb, DWORD stack_size );
|
extern TEB *THREAD_InitStack( TEB *teb, DWORD stack_size );
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue