kernel32.dll: implementation of GetVolumePathNamesForVolumeNameA/W
Tuomo Mattila
tuomom at ee.oulu.fi
Sun Jul 4 15:19:28 CDT 2010
Update to [PATCH][kernel32.dll] quick and dirty implementation of GetVolumePathNamesForVolumeNameA (try 2)
Moved implementation to GetVolumePathNamesForVolumeNameW. The -A version converts the input string to wide and passes it to the W function, then converts the results back to ANSI.
---
dlls/kernel32/kernel32.spec | 2 +-
dlls/kernel32/volume.c | 84 +++++++++++++++++++++++++++++++++++++++++--
2 files changed, 82 insertions(+), 4 deletions(-)
diff --git a/dlls/kernel32/kernel32.spec b/dlls/kernel32/kernel32.spec
index 843e97c..f067ebc 100644
--- a/dlls/kernel32/kernel32.spec
+++ b/dlls/kernel32/kernel32.spec
@@ -670,7 +670,7 @@
@ stdcall GetVolumeNameForVolumeMountPointW(wstr ptr long)
@ stdcall GetVolumePathNameA(str ptr long)
@ stdcall GetVolumePathNameW(wstr ptr long)
-# @ stub GetVolumePathNamesForVolumeNameA
+@ stdcall GetVolumePathNamesForVolumeNameA(str ptr long ptr)
@ stdcall GetVolumePathNamesForVolumeNameW(wstr ptr long ptr)
@ stdcall GetWindowsDirectoryA(ptr long)
@ stdcall GetWindowsDirectoryW(ptr long)
diff --git a/dlls/kernel32/volume.c b/dlls/kernel32/volume.c
index 7596864..32a283a 100644
--- a/dlls/kernel32/volume.c
+++ b/dlls/kernel32/volume.c
@@ -1566,13 +1566,91 @@ BOOL WINAPI GetVolumePathNameW(LPCWSTR filename, LPWSTR volumepathname, DWORD bu
}
/***********************************************************************
+ * GetVolumePathNamesForVolumeNameA (KERNEL32.@)
+ */
+BOOL WINAPI GetVolumePathNamesForVolumeNameA(LPCSTR volumename, LPSTR volumepathname, DWORD buflen, PDWORD returnlen)
+{
+
+ BOOL ret = FALSE;
+ WCHAR* volumenameW = 0;
+ LPWSTR volumepathnameW = 0;
+
+ if (volumename == 0 || volumepathname == 0 || returnlen == 0)
+ {
+ SetLastError(RPC_X_NULL_REF_POINTER);
+ return FALSE;
+ }
+
+ memset(volumepathname, 0, buflen);
+
+ volumepathnameW = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, buflen*sizeof(WCHAR));
+ if (volumepathnameW == 0) return FALSE;
+
+ if ((volumenameW = FILE_name_AtoW(volumename, TRUE)) == 0) return FALSE;
+
+ ret = GetVolumePathNamesForVolumeNameW(volumenameW, volumepathnameW, buflen, returnlen);
+ if (*returnlen > 0)
+ FILE_name_WtoA(volumepathnameW, (*returnlen), volumepathname, (*returnlen));
+
+ HeapFree(GetProcessHeap(), 0, volumepathnameW);
+ HeapFree(GetProcessHeap(), 0, volumenameW);
+
+ return ret;
+}
+
+/***********************************************************************
* GetVolumePathNamesForVolumeNameW (KERNEL32.@)
*/
BOOL WINAPI GetVolumePathNamesForVolumeNameW(LPCWSTR volumename, LPWSTR volumepathname, DWORD buflen, PDWORD returnlen)
{
- FIXME("(%s, %p, %d, %p), stub!\n", debugstr_w(volumename), volumepathname, buflen, returnlen);
- SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
- return FALSE;
+
+ DWORD available_drives = GetLogicalDrives();
+ WCHAR letter;
+ DWORD count = 0;
+ WCHAR volumename2string[50];
+ LPWSTR volumename2 = volumename2string;
+ WCHAR pstr[4] = {'A', ':', '\\', 0};
+ LPCWSTR pathstring = pstr;
+
+
+
+ if (volumename == 0 || volumepathname == 0 || returnlen == 0)
+ {
+ SetLastError(RPC_X_NULL_REF_POINTER);
+ return FALSE;
+ }
+
+ memset(volumepathname, 0, buflen*sizeof(WCHAR));
+ for (letter='A'; letter<='Z'; letter++)
+ {
+ memset(volumename2string, 0, sizeof(volumename2string));
+ if (available_drives & (1<<(letter-'A')))
+ {
+ pstr[0] = letter;
+ if( (GetVolumeNameForVolumeMountPointW(pathstring, volumename2, 50)) && (!strncmpW(volumename, volumename2, 50))) /* if getvolumename... succeeds and the names match */
+ {
+ if ((count+4) <= (buflen-1)) /* don't append the string if we don't have enough buffer space */
+ {
+ volumepathname[count] = letter;
+ volumepathname[count+1] = ':';
+ volumepathname[count+2] = '\\';
+ volumepathname[count+3] = 0;
+ }
+ count += 4;
+ }
+ }
+ }
+ count++; /* the buffer requires space for an additional trailing null */
+ *returnlen = count;
+ if (count > (buflen))
+ {
+ SetLastError(ERROR_MORE_DATA);
+ return FALSE;
+ }
+ if (count == 0)
+ return FALSE;
+
+ return TRUE;
}
/***********************************************************************
--
1.7.1
More information about the wine-patches
mailing list