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