#include "windows.h" #if defined(__cplusplus) extern "C" { #endif typedef BOOL (WINAPI * PFN_GET_VOLUME_PATHNAMES_FOR_VOLUME_NAME_A)( LPCSTR lpszVolumeName, LPSTR lpszVolumePathNames, DWORD cchBufferLength, PDWORD lpcchReturnLength ); typedef BOOL (WINAPI * PFN_GET_VOLUME_PATHNAMES_FOR_VOLUME_NAME_W)( LPCWSTR lpszVolumeName, LPWSTR lpszVolumePathNames, DWORD cchBufferLength, PDWORD lpcchReturnLength ); typedef BOOL (WINAPI * PFN_GET_VOLUME_PATHNAMES_FOR_VOLUME_NAME_VOID)( const void * lpszVolumeName, void * lpszVolumePathNames, DWORD cchBufferLength, PDWORD lpcchReturnLength ); BOOL WINAPI FusionpGetVolumePathNamesForVolumeNameGeneric( const void * lpszVolumeName, void * lpszVolumePathNames, DWORD cchBufferLength, PDWORD lpcchReturnLength, const char * Name, PFN_GET_VOLUME_PATHNAMES_FOR_VOLUME_NAME_VOID * FunctionPointer, DWORD * Error ) { DWORD LocalError; PFN_GET_VOLUME_PATHNAMES_FOR_VOLUME_NAME_VOID LocalFunctionPointer; if ((LocalError = *Error) != NO_ERROR) { SetLastError(LocalError); return FALSE; } if (*FunctionPointer == NULL) { HMODULE Kernel32 = LoadLibraryW(L"Kernel32.dll"); if (Kernel32 == NULL) { if ((*Error = GetLastError()) == NO_ERROR) *Error = ERROR_PROC_NOT_FOUND; return FALSE; } LocalFunctionPointer = *FunctionPointer = (PFN_GET_VOLUME_PATHNAMES_FOR_VOLUME_NAME_VOID)GetProcAddress(Kernel32, Name); if (LocalFunctionPointer == NULL) { if ((*Error = GetLastError()) == NO_ERROR) *Error = ERROR_PROC_NOT_FOUND; return FALSE; } } return (**FunctionPointer)(lpszVolumeName, lpszVolumePathNames, cchBufferLength, lpcchReturnLength); } BOOL WINAPI FusionpGetVolumePathNamesForVolumeNameA( LPCSTR lpszVolumeName, LPSTR lpszVolumePathNames, DWORD cchBufferLength, PDWORD lpcchReturnLength ) { static PFN_GET_VOLUME_PATHNAMES_FOR_VOLUME_NAME_VOID FunctionPointer; static DWORD Error; return FusionpGetVolumePathNamesForVolumeNameGeneric( lpszVolumeName, lpszVolumePathNames, cchBufferLength, lpcchReturnLength, "FusionpGetVolumePathNamesForVolumeNameA", &FunctionPointer, &Error ); } BOOL WINAPI FusionpGetVolumePathNamesForVolumeNameW( LPCWSTR lpszVolumeName, LPWSTR lpszVolumePathNames, DWORD cchBufferLength, PDWORD lpcchReturnLength ) { static PFN_GET_VOLUME_PATHNAMES_FOR_VOLUME_NAME_VOID FunctionPointer; static DWORD Error; return FusionpGetVolumePathNamesForVolumeNameGeneric( lpszVolumeName, lpszVolumePathNames, cchBufferLength, lpcchReturnLength, "FusionpGetVolumePathNamesForVolumeNameW", &FunctionPointer, &Error ); } #if defined(__cplusplus) } /* extern "C" */ #endif