ntdll/kernel32 : #21
Eric Pouech
pouech-eric at wanadoo.fr
Thu May 8 13:42:36 CDT 2003
this patch implements the following ntdll functions:
- RtlDosPathNameToNtPathName_U
- RtlGetCurrentDirectory_U
- RtlGetFullPathName_U
- RtlSetCurrentDirectory_U (partially as we can't test whether a path
exists or not)
A+
--
Eric Pouech
-------------- next part --------------
Common subdirectories: dlls/ntdll20/CVS and dlls/ntdll/CVS
diff -u -x '*~' -x '.#*' dlls/ntdll20/ntdll.spec dlls/ntdll/ntdll.spec
--- dlls/ntdll20/ntdll.spec 2003-05-08 07:45:11.000000000 +0200
+++ dlls/ntdll/ntdll.spec 2003-05-08 08:32:13.000000000 +0200
@@ -347,10 +347,10 @@
@ stdcall RtlDestroyHeap(long)
@ stub RtlDestroyProcessParameters
@ stub RtlDestroyQueryDebugBuffer
-@ stdcall RtlDetermineDosPathNameType_U(wstr) RtlDetermineDosPathNameType_U
-@ stub RtlDoesFileExists_U
-@ stdcall RtlDosPathNameToNtPathName_U(ptr ptr long long)
-@ stub RtlDosSearchPath_U
+@ stdcall RtlDetermineDosPathNameType_U(wstr)
+@ stub RtlDoesFileExists_U #(wstr)
+@ stdcall RtlDosPathNameToNtPathName_U(wstr ptr ptr ptr)
+@ stub RtlDosSearchPath_U #(wstr wstr wstr long ptr ptr)
@ stdcall RtlDowncaseUnicodeChar(long)
@ stdcall RtlDowncaseUnicodeString(ptr ptr long)
@ stdcall RtlDumpResource(ptr)
@@ -408,10 +408,10 @@
@ stub RtlGetCallersAddress
@ stub RtlGetCompressionWorkSpaceSize
@ stdcall RtlGetControlSecurityDescriptor(ptr ptr ptr)
-@ stub RtlGetCurrentDirectory_U
+@ stdcall RtlGetCurrentDirectory_U(long ptr)
@ stdcall RtlGetDaclSecurityDescriptor(ptr ptr ptr ptr)
@ stub RtlGetElementGenericTable
-@ stub RtlGetFullPathName_U
+@ stdcall RtlGetFullPathName_U(wstr long ptr ptr)
@ stdcall RtlGetGroupSecurityDescriptor(ptr ptr ptr)
@ stdcall RtlGetLongestNtPathLength()
@ stub RtlGetNtGlobalFlags
@@ -511,7 +511,7 @@
@ stub RtlSelfRelativeToAbsoluteSD
@ stdcall RtlSetAllBits(ptr)
@ stdcall RtlSetBits(ptr long long)
-@ stub RtlSetCurrentDirectory_U
+@ stdcall RtlSetCurrentDirectory_U(ptr)
@ stdcall RtlSetCurrentEnvironment(wstr ptr)
@ stdcall RtlSetDaclSecurityDescriptor(ptr long ptr long)
@ stdcall RtlSetEnvironmentVariable(ptr ptr ptr)
diff -u -x '*~' -x '.#*' dlls/ntdll20/path.c dlls/ntdll/path.c
--- dlls/ntdll20/path.c 2003-05-07 19:34:50.000000000 +0200
+++ dlls/ntdll/path.c 2003-05-08 09:39:35.000000000 +0200
@@ -24,9 +24,15 @@
#include "winternl.h"
#include "wine/unicode.h"
#include "wine/debug.h"
+#include "ntdll_misc.h"
WINE_DEFAULT_DEBUG_CHANNEL(file);
+static const WCHAR DeviceRootW[] = {'\\','\\','.','\\',0};
+static const WCHAR NTDosPrefixW[] = {'\\','?','?','\\',0};
+static const WCHAR LongFileNamePfxW[] = {'\\','\\','?','\\',0};
+static const WCHAR UncPfxW[] = {'U','N','C','\\',0};
+
#define IS_SEPARATOR(ch) ((ch) == '\\' || (ch) == '/')
/***********************************************************************
@@ -50,7 +56,6 @@
}
}
-
/***********************************************************************
* RtlIsDosDeviceName_U (NTDLL.@)
*
@@ -128,6 +133,368 @@
return 0;
}
+/**************************************************************************
+ * RtlDosPathNameToNtPathName_U [NTDLL.@]
+ *
+ * dos_path: a DOS path name (fully qualified or not)
+ * ntpath: pointer to a UNICODE_STRING to hold the converted
+ * path name
+ * file_part:will point (in ntpath) to the file part in the path
+ * cd: directory reference (optional)
+ *
+ * FIXME:
+ * + fill the cd structure
+ */
+BOOLEAN WINAPI RtlDosPathNameToNtPathName_U(PWSTR dos_path,
+ PUNICODE_STRING ntpath,
+ PWSTR* file_part,
+ CURDIR* cd)
+{
+ ULONG sz, ptr_sz, offset;
+ WCHAR local[MAX_PATH];
+ LPWSTR ptr;
+
+ TRACE("(%s,%p,%p,%p)\n",
+ debugstr_w(dos_path), ntpath, file_part, cd);
+
+ if (cd)
+ {
+ FIXME("Unsupported parameter\n");
+ memset(cd, 0, sizeof(*cd));
+ }
+
+ if (!dos_path || !*dos_path) return FALSE;
+
+ if (!strcmpW(dos_path, LongFileNamePfxW))
+ {
+ dos_path += 4;
+ ptr = NULL;
+ ptr_sz = 0;
+ }
+ else
+ {
+ ptr = local;
+ ptr_sz = sizeof(local);
+ }
+ sz = RtlGetFullPathName_U(dos_path, ptr_sz, ptr, file_part);
+ if (sz == 0) return FALSE;
+ if (sz > ptr_sz)
+ {
+ ptr = RtlAllocateHeap(ntdll_get_process_heap(), 0, sz);
+ sz = RtlGetFullPathName_U(dos_path, sz, ptr, file_part);
+ }
+
+ ntpath->MaximumLength = sz + (4 /* unc\ */ + 4 /* \??\ */) * sizeof(WCHAR);
+ ntpath->Buffer = RtlAllocateHeap(ntdll_get_process_heap(), 0, ntpath->MaximumLength);
+ if (!ntpath->Buffer)
+ {
+ if (ptr != local) RtlFreeHeap(ntdll_get_process_heap(), 0, ptr);
+ return FALSE;
+ }
+
+ strcpyW(ntpath->Buffer, NTDosPrefixW);
+ offset = 0;
+ switch (RtlDetermineDosPathNameType_U(ptr))
+ {
+ case UNC_PATH: /* \\foo */
+ if (ptr[2] != '?')
+ {
+ offset = 2;
+ strcatW(ntpath->Buffer, UncPfxW);
+ }
+ break;
+ case DEVICE_PATH: /* \\.\foo */
+ offset = 4;
+ break;
+ default: break; /* needed to keep gcc quiet */
+ }
+
+ strcatW(ntpath->Buffer, ptr + offset);
+ ntpath->Length = strlenW(ntpath->Buffer) * sizeof(WCHAR);
+
+ if (file_part && *file_part)
+ *file_part = ntpath->Buffer + ntpath->Length / sizeof(WCHAR) - lstrlenW(*file_part);
+
+ /* FIXME: cd filling */
+
+ if (ptr != local) RtlFreeHeap(ntdll_get_process_heap(), 0, ptr);
+ return TRUE;
+}
+
+/******************************************************************
+ * get_full_path_helper
+ *
+ * Helper for RtlGetFullPathName_U
+ */
+static ULONG get_full_path_helper(LPCWSTR name, LPWSTR buffer, ULONG size)
+{
+ ULONG reqsize, mark = 0;
+ DOS_PATHNAME_TYPE type;
+ LPWSTR ptr;
+ UNICODE_STRING* cd;
+
+ reqsize = sizeof(WCHAR); /* '\0' at the end */
+
+ RtlAcquirePebLock();
+ cd = &ntdll_get_process_pmts()->CurrentDirectoryName;
+
+ switch (type = RtlDetermineDosPathNameType_U(name))
+ {
+ case UNC_PATH: /* \\foo */
+ case DEVICE_PATH: /* \\.\foo */
+ if (reqsize <= size) buffer[0] = '\0';
+ break;
+
+ case ABSOLUTE_DRIVE_PATH: /* c:\foo */
+ reqsize += sizeof(WCHAR);
+ if (reqsize <= size)
+ {
+ buffer[0] = toupperW(name[0]);
+ buffer[1] = '\0';
+ }
+ name++;
+ break;
+
+ case RELATIVE_DRIVE_PATH: /* c:foo */
+ if (toupperW(name[0]) != toupperW(cd->Buffer[0]) || cd->Buffer[1] != ':')
+ {
+ WCHAR drive[4];
+ UNICODE_STRING var, val;
+
+ drive[0] = '=';
+ drive[1] = name[0];
+ drive[2] = ':';
+ drive[3] = '\0';
+ var.Length = 6;
+ var.MaximumLength = 8;
+ var.Buffer = drive;
+ val.Length = 0;
+ val.MaximumLength = size;
+ val.Buffer = buffer;
+
+ name += 2;
+
+ switch (RtlQueryEnvironmentVariable_U(NULL, &var, &val))
+ {
+ case STATUS_SUCCESS:
+ /* FIXME: Win2k seems to check that the environment variable actually points
+ * to an existing directory. If not, root of the drive is used
+ * (this seems also to be the only spot in RtlGetFullPathName that the
+ * existence of a part of a path is checked)
+ */
+ /* fall thru */
+ case STATUS_BUFFER_TOO_SMALL:
+ reqsize += val.Length;
+ /* append trailing \\ */
+ reqsize += sizeof(WCHAR);
+ if (reqsize <= size)
+ {
+ buffer[reqsize / sizeof(WCHAR) - 2] = '\\';
+ buffer[reqsize / sizeof(WCHAR) - 1] = '\0';
+ }
+ break;
+ case STATUS_VARIABLE_NOT_FOUND:
+ reqsize += 3 * sizeof(WCHAR);
+ if (reqsize <= size)
+ {
+ buffer[0] = drive[1];
+ buffer[1] = ':';
+ buffer[2] = '\\';
+ buffer[3] = '\0';
+ }
+ break;
+ default:
+ ERR("Unsupported status code\n");
+ break;
+ }
+ break;
+ }
+ name += 2;
+ /* fall through */
+
+ case RELATIVE_PATH: /* foo */
+ reqsize += cd->Length;
+ mark = cd->Length / sizeof(WCHAR);
+ if (reqsize <= size)
+ strcpyW(buffer, cd->Buffer);
+ break;
+
+ case ABSOLUTE_PATH: /* \xxx */
+ if (cd->Buffer[1] == ':')
+ {
+ reqsize += 2 * sizeof(WCHAR);
+ if (reqsize <= size)
+ {
+ buffer[0] = cd->Buffer[0];
+ buffer[1] = ':';
+ buffer[2] = '\0';
+ }
+ }
+ else
+ {
+ unsigned len;
+
+ ptr = strchrW(cd->Buffer + 2, '\\');
+ if (ptr) ptr = strchrW(ptr + 1, '\\');
+ if (!ptr) ptr = cd->Buffer + strlenW(cd->Buffer);
+ len = (ptr - cd->Buffer) * sizeof(WCHAR);
+ reqsize += len;
+ mark = len / sizeof(WCHAR);
+ if (reqsize <= size)
+ {
+ memcpy(buffer, cd->Buffer, len);
+ buffer[len / sizeof(WCHAR)] = '\0';
+ }
+ else
+ buffer[0] = '\0';
+ }
+ break;
+
+ case UNC_DOT_PATH: /* \\. */
+ reqsize += 4 * sizeof(WCHAR);
+ name += 3;
+ if (reqsize <= size)
+ {
+ buffer[0] = '\\';
+ buffer[1] = '\\';
+ buffer[2] = '.';
+ buffer[3] = '\\';
+ buffer[4] = '\0';
+ }
+ break;
+
+ default:
+ ERR("Unrecognized type: %d\n", type);
+ return 0;
+ }
+ RtlReleasePebLock();
+
+ reqsize += strlenW(name) * sizeof(WCHAR);
+ if (reqsize > size) return reqsize;
+
+ strcatW(buffer, name);
+
+ /* convert every / into a \ */
+ for (ptr = buffer; ptr < buffer + size / sizeof(WCHAR); ptr++)
+ if (*ptr == '/') *ptr = '\\';
+
+ reqsize -= sizeof(WCHAR); /* don't count trailing \0 */
+
+ /* mark is non NULL for UNC names, so start path collapsing after server & share name
+ * other wise, it's a fully qualified DOS name, so start after the drive designation
+ */
+ for (ptr = buffer + (mark ? mark : 2); ptr < buffer + reqsize / sizeof(WCHAR); )
+ {
+ WCHAR* p = strchrW(ptr, '\\');
+ if (!p) break;
+
+ p++;
+ if (p[0] == '.')
+ {
+ switch (p[1])
+ {
+ case '.':
+ switch (p[2])
+ {
+ case '\\':
+ {
+ WCHAR* prev = p - 2;
+ while (prev >= buffer + mark && *prev != '\\') prev--;
+ /* either collapse \foo\.. into \ or \.. into \ */
+ if (prev < buffer + mark) prev = p - 1;
+ reqsize -= (p + 2 - prev) * sizeof(WCHAR);
+ memmove(prev, p + 2, buffer + reqsize - prev + sizeof(WCHAR));
+ }
+ break;
+ case '\0':
+ reqsize -= 2 * sizeof(WCHAR);
+ *p = 0;
+ break;
+ }
+ break;
+ case '\\':
+ reqsize -= 2 * sizeof(WCHAR);
+ memmove(ptr + 2, ptr, buffer + reqsize - ptr + sizeof(WCHAR));
+ break;
+ }
+ }
+ ptr = p;
+ }
+ return reqsize;
+}
+
+/******************************************************************
+ * RtlGetFullPathName_U
+ *
+ * Returns the number of bytes written to buffer (not including the
+ * terminating NULL) if the function succeeds, or the required number of bytes
+ * (including the terminating NULL) if the buffer is to small.
+ *
+ * file_part will point to the filename part inside buffer (except if we use
+ * DOS device name, in which case file_in_buf is NULL)
+ *
+ */
+DWORD WINAPI RtlGetFullPathName_U(const WCHAR* name, ULONG size, WCHAR* buffer,
+ WCHAR** file_part)
+{
+ DWORD dosdev;
+ DWORD reqsize;
+
+ TRACE("(%s %lu %p %p)\n", debugstr_w(name), size, buffer, file_part);
+
+ if (!name || !*name) return 0;
+
+ if (file_part) *file_part = NULL;
+
+ /* check for DOS device name */
+ dosdev = RtlIsDosDeviceName_U(name);
+ if (dosdev)
+ {
+ DWORD offset = dosdev >> 17; /* get it in WCHARs, not bytes */
+ DWORD sz = dosdev & 0xFFFF; /* in bytes */
+
+ if (8 + sz + 2 > size) return sz + 10;
+ strcpyW(buffer, DeviceRootW);
+ memmove(buffer + 4, name + offset, sz);
+ buffer[4 + sz / sizeof(WCHAR)] = '\0';
+ /* file_part isn't set in this case */
+ return sz + 8;
+ }
+
+ reqsize = get_full_path_helper(name, buffer, size);
+ if (reqsize > size)
+ {
+ LPWSTR tmp = RtlAllocateHeap(ntdll_get_process_heap(), 0, reqsize);
+ reqsize = get_full_path_helper(name, tmp, reqsize) + sizeof(WCHAR);
+ RtlFreeHeap(ntdll_get_process_heap(), 0, tmp);
+ }
+ else
+ {
+ WCHAR* ptr;
+ /* find file part */
+ if (file_part && (ptr = strrchrW(buffer, '\\')) != NULL && ptr >= buffer + 2 && *++ptr)
+ *file_part = ptr;
+ }
+ return reqsize;
+}
+
+/*************************************************************************
+ * RtlGetLongestNtPathLength [NTDLL.@]
+ *
+ * Get the longest allowed path length
+ *
+ * PARAMS
+ * None.
+ *
+ * RETURNS
+ * The longest allowed path length (277 characters under Win2k).
+ */
+DWORD WINAPI RtlGetLongestNtPathLength(void)
+{
+ TRACE("()\n");
+ return 277;
+}
+
/******************************************************************
* RtlIsNameLegalDOS8Dot3 (NTDLL.@)
*
@@ -196,3 +563,119 @@
if (spaces) *spaces = got_space;
return TRUE;
}
+
+/******************************************************************
+ * RtlGetCurrentDirectory_U (NTDLL.@)
+ *
+ */
+NTSTATUS WINAPI RtlGetCurrentDirectory_U(ULONG buflen, LPWSTR buf)
+{
+ UNICODE_STRING* us;
+ ULONG len;
+
+ TRACE("(%lu %p)\n", buflen, buf);
+
+ RtlAcquirePebLock();
+
+ us = &ntdll_get_process_pmts()->CurrentDirectoryName;
+ len = us->Length / sizeof(WCHAR);
+ if (us->Buffer[len - 1] == '\\' && us->Buffer[len - 2] != ':')
+ len--;
+
+ if (buflen / sizeof(WCHAR) > len)
+ {
+ memcpy(buf, us->Buffer, len * sizeof(WCHAR));
+ buf[len] = '\0';
+ }
+ else
+ {
+ len++;
+ }
+
+ RtlReleasePebLock();
+
+ return len * sizeof(WCHAR);
+}
+
+/******************************************************************
+ * RtlSetCurrentDirectory_U (NTDLL.@)
+ *
+ */
+NTSTATUS WINAPI RtlSetCurrentDirectory_U(UNICODE_STRING* dir)
+{
+ UNICODE_STRING* curdir;
+ NTSTATUS nts = STATUS_SUCCESS;
+ ULONG size;
+ PWSTR buf = NULL;
+
+ TRACE("(%s)\n", debugstr_w(dir->Buffer));
+
+ RtlAcquirePebLock();
+
+ curdir = &ntdll_get_process_pmts()->CurrentDirectoryName;
+ size = curdir->MaximumLength;
+
+ buf = RtlAllocateHeap(ntdll_get_process_heap(), 0, size);
+ if (buf == NULL)
+ {
+ nts = STATUS_NO_MEMORY;
+ goto out;
+ }
+
+ size = RtlGetFullPathName_U(dir->Buffer, size, buf, 0);
+ if (!size)
+ {
+ nts = STATUS_OBJECT_NAME_INVALID;
+ goto out;
+ }
+
+ switch (RtlDetermineDosPathNameType_U(buf))
+ {
+ case ABSOLUTE_DRIVE_PATH:
+ case UNC_PATH:
+ break;
+ default:
+ FIXME("Don't support those cases yes\n");
+ return STATUS_NOT_IMPLEMENTED;
+ }
+
+ /* FIXME: should check that the directory actually exists,
+ * and fill CurrentDirectoryHandle accordingly
+ */
+
+ /* append trailing \ if missing */
+ if (buf[size / sizeof(WCHAR) - 1] != '\\')
+ {
+ buf[size / sizeof(WCHAR)] = '\\';
+ buf[size / sizeof(WCHAR) + 1] = '\0';
+ size += sizeof(WCHAR);
+ }
+
+ memmove(curdir->Buffer, buf, size + sizeof(WCHAR));
+ 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:
+ if (buf) RtlFreeHeap(ntdll_get_process_heap(), 0, buf);
+
+ RtlReleasePebLock();
+
+ return nts;
+}
diff -u -x '*~' -x '.#*' dlls/ntdll20/rtl.c dlls/ntdll/rtl.c
--- dlls/ntdll20/rtl.c 2003-05-08 07:45:11.000000000 +0200
+++ dlls/ntdll/rtl.c 2003-05-08 08:32:43.000000000 +0200
@@ -370,55 +370,6 @@
context->Esp -= context->Eax;
}
-/**************************************************************************
- * RtlDosPathNameToNtPathName_U [NTDLL.@]
- *
- * szwDosPath: a fully qualified DOS path name
- * ntpath: pointer to a UNICODE_STRING to hold the converted
- * path name
- *
- * FIXME: Should we not allocate the ntpath buffer under some
- * circumstances?
- * Are the conversions static? (always prepend '\??\' ?)
- * Not really sure about the last two arguments.
- */
-BOOLEAN WINAPI RtlDosPathNameToNtPathName_U(
- LPWSTR szwDosPath,PUNICODE_STRING ntpath,
- DWORD x2,DWORD x3)
-{
- ULONG length;
- UNICODE_STRING pathprefix;
- WCHAR szPrefix[] = { '\\', '?', '?', '\\', 0 };
-
- FIXME("(%s,%p,%08lx,%08lx) partial stub\n",
- debugstr_w(szwDosPath),ntpath,x2,x3);
-
- if ( !szwDosPath )
- return FALSE;
-
- if ( !szwDosPath[0] )
- return FALSE;
-
- if ( szwDosPath[1]!= ':' )
- return FALSE;
-
- length = strlenW(szwDosPath) * sizeof (WCHAR) + sizeof szPrefix;
-
- ntpath->Buffer = RtlAllocateHeap(ntdll_get_process_heap(), 0, length);
- ntpath->Length = 0;
- ntpath->MaximumLength = length;
-
- if ( !ntpath->Buffer )
- return FALSE;
-
- RtlInitUnicodeString( &pathprefix, szPrefix );
- RtlCopyUnicodeString( ntpath, &pathprefix );
- RtlAppendUnicodeToString( ntpath, szwDosPath );
-
- return TRUE;
-}
-
-
/******************************************************************************
* RtlInitializeGenericTable [NTDLL.@]
*/
@@ -606,23 +557,6 @@
*lpDest++ = ulValue;
}
-/*************************************************************************
- * RtlGetLongestNtPathLength [NTDLL.@]
- *
- * Get the longest allowed path length
- *
- * PARAMS
- * None.
- *
- * RETURNS
- * The longest allowed path length (277 characters under Win2k).
- */
-DWORD WINAPI RtlGetLongestNtPathLength(void)
-{
- TRACE("()\n");
- return 277;
-}
-
/*********************************************************************
* RtlComputeCrc32 [NTDLL.@]
*
Common subdirectories: dlls/ntdll20/tests and dlls/ntdll/tests
Common subdirectories: files20/CVS and files/CVS
Common subdirectories: include20/bitmaps and include/bitmaps
Common subdirectories: include20/CVS and include/CVS
Common subdirectories: include20/msvcrt and include/msvcrt
Common subdirectories: include20/wine and include/wine
diff -u -x '*~' -x '.#*' include20/winternl.h include/winternl.h
--- include20/winternl.h 2003-05-08 07:45:24.000000000 +0200
+++ include/winternl.h 2003-05-08 10:13:58.000000000 +0200
@@ -95,6 +95,12 @@
HANDLE UniqueThread;
} CLIENT_ID, *PCLIENT_ID;
+typedef struct _CURDIR
+{
+ UNICODE_STRING DosPath;
+ PVOID Handle;
+} CURDIR, *PCURDIR;
+
/***********************************************************************
* Enums
*/
@@ -965,7 +971,7 @@
NTSTATUS WINAPI RtlDestroyEnvironment(PWSTR);
HANDLE WINAPI RtlDestroyHeap(HANDLE);
DOS_PATHNAME_TYPE WINAPI RtlDetermineDosPathNameType_U(PCWSTR);
-BOOLEAN WINAPI RtlDosPathNameToNtPathName_U(LPWSTR,PUNICODE_STRING,DWORD,DWORD);
+BOOLEAN WINAPI RtlDosPathNameToNtPathName_U(LPWSTR,PUNICODE_STRING,PWSTR*,CURDIR*);
WCHAR WINAPI RtlDowncaseUnicodeChar(WCHAR);
NTSTATUS WINAPI RtlDowncaseUnicodeString(UNICODE_STRING*,const UNICODE_STRING*,BOOLEAN);
void WINAPI RtlDumpResource(LPRTL_RWLOCK);
@@ -1013,9 +1019,11 @@
DWORD WINAPI RtlGetAce(PACL,DWORD,LPVOID *);
NTSTATUS WINAPI RtlGetControlSecurityDescriptor(PSECURITY_DESCRIPTOR, PSECURITY_DESCRIPTOR_CONTROL,LPDWORD);
+NTSTATUS WINAPI RtlGetCurrentDirectory_U(ULONG, LPWSTR);
NTSTATUS WINAPI RtlGetDaclSecurityDescriptor(PSECURITY_DESCRIPTOR,PBOOLEAN,PACL *,PBOOLEAN);
ULONG WINAPI RtlGetFullPathName_U(PCWSTR,ULONG,PWSTR,PWSTR*);
NTSTATUS WINAPI RtlGetGroupSecurityDescriptor(PSECURITY_DESCRIPTOR,PSID *,PBOOLEAN);
+DWORD WINAPI RtlGetLongestNtPathLength(void);
BOOLEAN WINAPI RtlGetNtProductType(LPDWORD);
NTSTATUS WINAPI RtlGetOwnerSecurityDescriptor(PSECURITY_DESCRIPTOR,PSID *,PBOOLEAN);
ULONG WINAPI RtlGetProcessHeaps(ULONG,HANDLE*);
@@ -1092,6 +1100,7 @@
void WINAPI RtlSecondsSince1980ToTime(DWORD,LARGE_INTEGER *);
void WINAPI RtlSetAllBits(PRTL_BITMAP);
void WINAPI RtlSetBits(PRTL_BITMAP,ULONG,ULONG);
+NTSTATUS WINAPI RtlSetCurrentDirectory_U(UNICODE_STRING*);
void WINAPI RtlSetCurrentEnvironment(PWSTR, PWSTR*);
NTSTATUS WINAPI RtlSetDaclSecurityDescriptor(PSECURITY_DESCRIPTOR,BOOLEAN,PACL,BOOLEAN);
NTSTATUS WINAPI RtlSetEnvironmentVariable(PWSTR*,PUNICODE_STRING,PUNICODE_STRING);
Common subdirectories: relay3220/CVS and relay32/CVS
Common subdirectories: scheduler20/CVS and scheduler/CVS
diff -u -x '*~' -x '.#*' scheduler20/process.c scheduler/process.c
--- scheduler20/process.c 2003-05-08 07:45:31.000000000 +0200
+++ scheduler/process.c 2003-05-08 10:13:06.000000000 +0200
@@ -471,6 +471,17 @@
/* Parse command line arguments */
OPTIONS_ParseOptions( !info_size ? argv : NULL );
+ /* <hack: to be changed later on> */
+ build_initial_environment();
+ process_pmts.CurrentDirectoryName.Length = 3 * sizeof(WCHAR);
+ process_pmts.CurrentDirectoryName.MaximumLength = RtlGetLongestNtPathLength() * sizeof(WCHAR);
+ process_pmts.CurrentDirectoryName.Buffer = RtlAllocateHeap( ntdll_get_process_heap(), 0, process_pmts.CurrentDirectoryName.MaximumLength);
+ process_pmts.CurrentDirectoryName.Buffer[0] = 'C';
+ process_pmts.CurrentDirectoryName.Buffer[1] = ':';
+ process_pmts.CurrentDirectoryName.Buffer[2] = '\\';
+ process_pmts.CurrentDirectoryName.Buffer[3] = '\0';
+ /* </hack: to be changed later on> */
+
ret = MAIN_MainInit();
if (TRACE_ON(relay) || TRACE_ON(snoop)) RELAY_InitDebugLists();
More information about the wine-patches
mailing list