shell32: implementation of SheGetDirA/W and SheChangeDirA/W

Martin Fuchs martin-fuchs at gmx.net
Sun May 13 13:04:25 CDT 2007


Changelog:
implement SheGetDirA/W and SheChangeDirA/W in shell32
This functions are needed for the good old winfile.exe of NT4.


Index: dlls/shell32/shlfileop.c
===================================================================
RCS file: /home/wine/wine/dlls/shell32/shlfileop.c,v
retrieving revision 1.89
diff -u -p -d -r1.89 shlfileop.c
--- dlls/shell32/shlfileop.c	14 Feb 2007 15:29:33 -0000	1.89
+++ dlls/shell32/shlfileop.c	13 May 2007 20:08:13 -0000
@@ -1576,37 +1576,103 @@ void WINAPI SHFreeNameMappings(HANDLE hN
 /*************************************************************************
  * SheGetDirA [SHELL32.@]
  *
- */
-HRESULT WINAPI SheGetDirA(LPSTR u, LPSTR v)
-{   FIXME("%p %p stub\n",u,v);
+ * drive = 0: returns the current directory path
+ * drive > 0: returns the current directory path of the specified drive
+ *            drive=1 -> A:  drive=2 -> B:  ...
+ * returns 0 if successfull
+*/
+DWORD WINAPI SheGetDirA(DWORD drive, LPSTR buffer)
+{
+    WCHAR org_path[MAX_PATH];
+    DWORD ret;
+    char drv_path[3];
+
+    /* change current directory to the specified drive */
+    if (drive) {
+        strcpy(drv_path, "A:");
+        drv_path[0] += (char)drive-1;
+
+        GetCurrentDirectoryW(MAX_PATH, org_path);
+
+        SetCurrentDirectoryA(drv_path);
+    }
+
+    /* query current directory path of the specified drive */
+    ret = GetCurrentDirectoryA(MAX_PATH, buffer);
+
+    /* back to the original drive */
+    if (drive)
+        SetCurrentDirectoryW(org_path);
+
+    if (!ret)
+        return GetLastError();
+
     return 0;
 }
 
 /*************************************************************************
  * SheGetDirW [SHELL32.@]
  *
+ * drive = 0: returns the current directory path
+ * drive > 0: returns the current directory path of the specified drive
+ *            drive=1 -> A:  drive=2 -> B:  ...
+ * returns 0 if successfull
  */
-HRESULT WINAPI SheGetDirW(LPWSTR u, LPWSTR v)
-{	FIXME("%p %p stub\n",u,v);
-	return 0;
+DWORD WINAPI SheGetDirW(DWORD drive, LPWSTR buffer)
+{
+    WCHAR org_path[MAX_PATH];
+    DWORD ret;
+    char drv_path[3];
+
+    /* change current directory to the specified drive */
+    if (drive) {
+        strcpy(drv_path, "A:");
+        drv_path[0] += (char)drive-1;
+
+        GetCurrentDirectoryW(MAX_PATH, org_path);
+
+        SetCurrentDirectoryA(drv_path);
+    }
+
+    /* query current directory path of the specified drive */
+    ret = GetCurrentDirectoryW(MAX_PATH, buffer);
+
+    /* back to the original drive */
+    if (drive)
+        SetCurrentDirectoryW(org_path);
+
+    if (!ret)
+        return GetLastError();
+
+    return 0;
 }
 
 /*************************************************************************
  * SheChangeDirA [SHELL32.@]
  *
+ * changes the current directory to the specified path
+ * and returns 0 if successfull
  */
-HRESULT WINAPI SheChangeDirA(LPSTR u)
-{   FIXME("(%s),stub\n",debugstr_a(u));
-    return 0;
+DWORD WINAPI SheChangeDirA(LPSTR path)
+{
+    if (SetCurrentDirectoryA(path))
+        return 0;
+    else
+        return GetLastError();
 }
 
 /*************************************************************************
  * SheChangeDirW [SHELL32.@]
  *
+ * changes the current directory to the specified path
+ * and returns 0 if successfull
  */
-HRESULT WINAPI SheChangeDirW(LPWSTR u)
-{	FIXME("(%s),stub\n",debugstr_w(u));
-	return 0;
+DWORD WINAPI SheChangeDirW(LPWSTR path)
+{
+    if (SetCurrentDirectoryW(path))
+        return 0;
+    else
+        return GetLastError();
 }
 
 /*************************************************************************




More information about the wine-patches mailing list