//************************************************************************ // // dpmffio.c : Dynamic Patch Module for File I/O API family // // History: // 26-jan-02 cmjones created it. // //************************************************************************ #ifdef DBG unsigned long dwLogLevel = 0; #endif #include #include #include #include #include "dpmtbls.h" #include "dpmdbg.h" // include handy debug print macros #include "shimdb.h" BOOL DllInitProc(HMODULE hModule, DWORD Reason, PCONTEXT pContext); PFAMILY_TABLE DpmInitFamTable(PFAMILY_TABLE, HMODULE, PVOID, PVOID, LPWSTR, PDPMMODULESETS); void DpmDestroyFamTable(PFAMILY_TABLE pgDpmFamTbl, PFAMILY_TABLE pFT); #define GROW_HEAP_AS_NEEDED 0 HANDLE hHeap = NULL; DWORD dwTlsIndex; char szShimEngDll[] = "\\ShimEng.dll"; BOOL DllInitProc(HMODULE hModule, DWORD Reason, PCONTEXT pContext) { BOOL bRet = TRUE; UNREFERENCED_PARAMETER(hModule); UNREFERENCED_PARAMETER(pContext); switch(Reason) { case DLL_PROCESS_ATTACH: if((hHeap = HeapCreate(0, 4096, GROW_HEAP_AS_NEEDED)) == NULL) { DPMDBGPRN("NTVDM::DpmfFio:Can't initialize heap!\n"); bRet = FALSE; } dwTlsIndex = TlsAlloc(); if(dwTlsIndex == TLS_OUT_OF_INDEXES) { DPMDBGPRN("NTVDM::DpmfFio:Can't initialize TLS!\n"); bRet = FALSE; } break; case DLL_PROCESS_DETACH: if(hHeap) { HeapDestroy(hHeap); } TlsFree(dwTlsIndex); break; } return bRet; } PFAMILY_TABLE DpmInitFamTable(PFAMILY_TABLE pgDpmFamTbl, HMODULE hMod, PVOID hSdb, PVOID pSdbQuery, LPWSTR pwszAppFilePath, PDPMMODULESETS pModSet) { int i, numApis, len; PVOID lpdpmfn; PFAMILY_TABLE pFT = NULL; PVOID *pFN = NULL; PVOID *pShimTbl = NULL; PAPIDESC pApiDesc = NULL; VDMTABLE VdmTbl; char szShimEng[MAX_PATH]; HMODULE hModShimEng = NULL; LPFNSE_SHIMNTVDM lpShimNtvdm; DPMDBGPRN("NTVDM::DpmfFio:Initialziing File I/O API tables\n"); // Get hooked API count from global table numApis = pgDpmFamTbl->numHookedAPIs; // Allocate a new family table pFT = (PFAMILY_TABLE)HeapAlloc(hHeap, HEAP_ZERO_MEMORY, sizeof(FAMILY_TABLE)); if(!pFT) { DPMDBGPRN("NTVDM::DpmfFio:DpmInit:malloc 1 failed\n"); goto ErrorExit; } // Allocate the shim dispatch table for this family in this task pShimTbl = (PVOID *)HeapAlloc(hHeap, HEAP_ZERO_MEMORY, numApis * sizeof(PVOID)); if(!pShimTbl) { DPMDBGPRN("NTVDM::DpmfFio:DpmInit:malloc 2 failed\n"); goto ErrorExit; } pFT->pDpmShmTbls = pShimTbl; // Allocate an array of ptrs to hooked API's pFN = (PVOID *)HeapAlloc(hHeap, HEAP_ZERO_MEMORY, numApis * sizeof(PVOID)); if(!pFN) { DPMDBGPRN("NTVDM::DpmfFio:DpmInit:malloc 3 failed\n"); goto ErrorExit; } pFT->pfn = pFN; pFT->numHookedAPIs = numApis; pFT->hMod = hMod; // Allocate a temp array of APIDESC structs to help attach shims pApiDesc = (PAPIDESC)HeapAlloc(hHeap, HEAP_ZERO_MEMORY, numApis * sizeof(APIDESC)); if(!pApiDesc) { DPMDBGPRN("NTVDM::DpmfFio:DpmInit:malloc 4 failed\n"); goto ErrorExit; } VdmTbl.nApiCount = numApis; VdmTbl.ppfnOrig = pShimTbl; VdmTbl.pApiDesc = pApiDesc; // Fill in the family table with ptrs to the patch functions in this DLL. for(i = 0; i < numApis; i++) { // must start with 1 since EXPORT ordinals can't be == 0 lpdpmfn = (PVOID)GetProcAddress(hMod, (LPCSTR)MAKELONG(i+1, 0)); if(!lpdpmfn) { DPMDBGPRN("NTVDM::DpmfFio:DpmInit:Unable to get proc address\n"); goto ErrorExit; } // save ptr to the real API in the shim table until it gets shimmed pShimTbl[i] = pgDpmFamTbl->pfn[i]; // relate the corresponding module and API name to the API function ptr pApiDesc[i].pszModule = (char *)pModSet->ApiModuleName; pApiDesc[i].pszApi = (char *)pModSet->ApiNames[i]; // save ptr to the patch function pFN[i] = lpdpmfn; } // Only do this if we need to attach the shim engine. GetSystemDirectory(szShimEng, MAX_PATH); strcat(szShimEng, szShimEngDll); hModShimEng = LoadLibrary(szShimEng); pFT->hModShimEng = hModShimEng; if(NULL == hModShimEng) { DPMDBGPRN("NTVDM::DpmfFio:DpmInit:ShimEng load failed\n"); goto ErrorExit; } lpShimNtvdm = (LPFNSE_SHIMNTVDM)GetProcAddress(hModShimEng, "SE_ShimNTVDM"); if(!lpShimNtvdm) { DPMDBGPRN("NTVDM::DpmfFio:DpmInit:GetProcAddress failed\n"); goto ErrorExit; } // Patch the shim dispatch table with the shim function ptrs // If this fails we will stick with ptrs to the original API's (lpShimNtvdm)(pwszAppFilePath, hSdb, pSdbQuery, &VdmTbl); // Do this if you want dispatch directly to the shim functions // for(i = 0; i < numApis; i++) { // pFN[i] = pShimTbl[i]; // } // HeapFree(hHeap, 0, pShimTbl); // pFT->pDpmShmTbls = NULL; if(!TlsSetValue(dwTlsIndex, pFT)) { DPMDBGPRN("NTVDM::DpmfFio:DpmInit:TLS set failed\n"); goto ErrorExit; } if(pApiDesc) { HeapFree(hHeap, 0, pApiDesc); } DPMDBGPRN1(" DpmfFio:Returning File I/o API tables: %#lx\n",pFT); return(pFT); ErrorExit: DPMDBGPRN(" DpmfFio:Init failed: Returning NULL\n"); DpmDestroyFamTable(pgDpmFamTbl, pFT); if(pApiDesc) { HeapFree(hHeap, 0, pApiDesc); } return(NULL); } void DpmDestroyFamTable(PFAMILY_TABLE pgDpmFamTbl, PFAMILY_TABLE pFT) { PVDM_TIB pVdmTib; PVOID *pShimTbl; LPFNSE_REMOVENTVDM lpfnSE_RemoveNtvdmTask = NULL; DPMDBGPRN("NTVDM::DpmfFio:Destroying File I/O API tables for task\n"); // if this task is using the global table for this family, nothing to do if(!pFT || pFT == pgDpmFamTbl) return; pShimTbl = pFT->pDpmShmTbls; if(pShimTbl) { HeapFree(hHeap, 0, pShimTbl); } if(pFT->pfn) { HeapFree(hHeap, 0, pFT->pfn); } // See if the shim engine is attached & detach it if(pFT->hModShimEng) { lpfnSE_RemoveNtvdmTask = (LPFNSE_REMOVENTVDM)GetProcAddress(pFT->hModShimEng, "SE_RemoveNTVDMTask"); if(lpfnSE_RemoveNtvdmTask) { (lpfnSE_RemoveNtvdmTask)(NtCurrentTeb()->ClientId.UniqueThread); } FreeLibrary(pFT->hModShimEng); } HeapFree(hHeap, 0, pFT); } // ^^^^^^^^^^ All the above should be in every DPM module. ^^^^^^^^^^^^ // vvvvvvvvvv Define module specific stuff below. vvvvvvvvvvvv HFILE dpmOpenFile(LPCSTR lpFileName, LPOFSTRUCT lpof, UINT uStyle) { PFAMILY_TABLE pFT = (PFAMILY_TABLE)TlsGetValue(dwTlsIndex); HFILE ret = 0; DPMDBGPRN("OpenFile: "); ret = SHM_OpenFile(lpFileName, lpof, uStyle); DPMDBGPRN1(" -> %#lx\n", ret); return(ret); } HFILE dpm_lclose(HFILE hFile) { PFAMILY_TABLE pFT = (PFAMILY_TABLE)TlsGetValue(dwTlsIndex); HFILE ret = 0; DPMDBGPRN("_lclose: "); ret = SHM__lclose(hFile); DPMDBGPRN1(" -> %#lx\n", ret); return(ret); } HFILE dpm_lopen(LPCSTR lpPathName, int iReadWrite) { PFAMILY_TABLE pFT = (PFAMILY_TABLE)TlsGetValue(dwTlsIndex); HFILE ret = 0; DPMDBGPRN("_lopen: "); ret = SHM__lopen(lpPathName, iReadWrite); DPMDBGPRN1(" -> %#lx\n", ret); return(ret); } HFILE dpm_lcreat(LPCSTR lpPathName, int iAttribute) { PFAMILY_TABLE pFT = (PFAMILY_TABLE)TlsGetValue(dwTlsIndex); HFILE ret = 0; DPMDBGPRN("_lcreat: "); ret = SHM__lcreat(lpPathName, iAttribute); DPMDBGPRN1(" -> %#lx\n", ret); return(ret); } LONG dpm_llseek(HFILE hFile, LONG lOffset, int iOrigin) { PFAMILY_TABLE pFT = (PFAMILY_TABLE)TlsGetValue(dwTlsIndex); LONG ret = 0; DPMDBGPRN("_llseek: "); ret = SHM__llseek(hFile, lOffset, iOrigin); DPMDBGPRN1(" -> %ld\n", ret); return(ret); } UINT dpm_lread(HFILE hFile, LPVOID lpBuffer, UINT uBytes) { PFAMILY_TABLE pFT = (PFAMILY_TABLE)TlsGetValue(dwTlsIndex); UINT ret = 0; DPMDBGPRN("_lread: "); ret = SHM__lread(hFile, lpBuffer, uBytes); DPMDBGPRN1(" -> %ld\n", ret); return(ret); } UINT dpm_lwrite(HFILE hFile, LPCSTR lpBuffer, UINT uBytes) { PFAMILY_TABLE pFT = (PFAMILY_TABLE)TlsGetValue(dwTlsIndex); UINT ret = 0; DPMDBGPRN("_lwrite: "); ret = SHM__lwrite(hFile, lpBuffer, uBytes); DPMDBGPRN1(" -> %ld\n", ret); return(ret); } long dpm_hread(HFILE hFile, LPVOID lpBuffer, long lBytes) { PFAMILY_TABLE pFT = (PFAMILY_TABLE)TlsGetValue(dwTlsIndex); long ret = 0; DPMDBGPRN("_hread: "); ret = SHM__hread(hFile, lpBuffer, lBytes); DPMDBGPRN1(" -> %ld\n", ret); return(ret); } long dpm_hwrite(HFILE hFile, LPCSTR lpBuffer, long lBytes) { PFAMILY_TABLE pFT = (PFAMILY_TABLE)TlsGetValue(dwTlsIndex); LONG ret = 0; DPMDBGPRN("_hwrite: "); ret = SHM__hwrite(hFile, lpBuffer, lBytes); DPMDBGPRN1(" -> %ld\n", ret); return(ret); } UINT dpmGetTempFileName(LPCSTR lpPathName, LPCSTR lpPrefixString, UINT uUnique, LPSTR lpTempFileName) { PFAMILY_TABLE pFT = (PFAMILY_TABLE)TlsGetValue(dwTlsIndex); LONG ret = 0; DPMDBGPRN("GetTempFileName: "); ret = SHM_GetTempFileName(lpPathName, lpPrefixString, uUnique, lpTempFileName); DPMDBGPRN1(" -> %ld\n", ret); return(ret); } BOOL dpmAreFileApisANSI(VOID) { PFAMILY_TABLE pFT = (PFAMILY_TABLE)TlsGetValue(dwTlsIndex); BOOL ret = 0; DPMDBGPRN("AreFileApisANSI: "); ret = SHM_AreFileApisANSI(); DPMDBGPRN1(" -> %#lx\n", ret); return(ret); } BOOL dpmCancelIo(HANDLE hFile) { PFAMILY_TABLE pFT = (PFAMILY_TABLE)TlsGetValue(dwTlsIndex); BOOL ret = 0; DPMDBGPRN("CancelIo: "); ret = SHM_CancelIo(hFile); DPMDBGPRN1(" -> %#lx\n", ret); return(ret); } BOOL dpmCloseHandle(HANDLE hObject) { PFAMILY_TABLE pFT = (PFAMILY_TABLE)TlsGetValue(dwTlsIndex); BOOL ret = 0; DPMDBGPRN("CloseHandle: "); ret = SHM_CloseHandle(hObject); DPMDBGPRN1(" -> %#lx\n", ret); return(ret); } BOOL dpmCopyFile(LPCSTR lpExistingFileName, LPCSTR lpNewFileName, BOOL bFailIfExists) { PFAMILY_TABLE pFT = (PFAMILY_TABLE)TlsGetValue(dwTlsIndex); BOOL ret = 0; DPMDBGPRN("CopyFile: "); ret = SHM_CopyFile(lpExistingFileName, lpNewFileName, bFailIfExists); DPMDBGPRN1(" -> %#lx\n", ret); return(ret); } BOOL dpmCopyFileEx(LPCSTR lpExistingFileName, LPCSTR lpNewFileName, LPPROGRESS_ROUTINE lpProgressRoutine, LPVOID lpData, LPBOOL pbCancel, DWORD dwCopyFlags) { PFAMILY_TABLE pFT = (PFAMILY_TABLE)TlsGetValue(dwTlsIndex); BOOL ret = 0; DPMDBGPRN("CopyFileEx: "); ret = SHM_CopyFileEx(lpExistingFileName, lpNewFileName, lpProgressRoutine, lpData, pbCancel, dwCopyFlags); DPMDBGPRN1(" -> %#lx\n", ret); return(ret); } BOOL dpmCreateDirectory(LPCSTR lpPathName, LPSECURITY_ATTRIBUTES lpSecurityAttributes) { PFAMILY_TABLE pFT = (PFAMILY_TABLE)TlsGetValue(dwTlsIndex); BOOL ret = 0; DPMDBGPRN("CreateDirectory: "); ret = SHM_CreateDirectory(lpPathName, lpSecurityAttributes); DPMDBGPRN1(" -> %#lx\n", ret); return(ret); } BOOL dpmCreateDirectoryEx(LPCSTR lpTemplateDirectory, LPCSTR lpNewDirectory, LPSECURITY_ATTRIBUTES lpSecurityAttributes) { PFAMILY_TABLE pFT = (PFAMILY_TABLE)TlsGetValue(dwTlsIndex); BOOL ret = 0; DPMDBGPRN("CreateDirectoryEx: "); ret = SHM_CreateDirectoryEx(lpTemplateDirectory, lpNewDirectory, lpSecurityAttributes); DPMDBGPRN1(" -> %#lx\n", ret); return(ret); } HANDLE dpmCreateFile(LPCSTR lpFileName, DWORD dwDesiredAccess, DWORD dwShareMode, LPSECURITY_ATTRIBUTES lpSecurityAttributes, DWORD dwCreationDisposition, DWORD dwFlagsAndAttributes, HANDLE hTemplateFile) { PFAMILY_TABLE pFT = (PFAMILY_TABLE)TlsGetValue(dwTlsIndex); HANDLE ret = 0; DPMDBGPRN("CreateFile: "); ret = SHM_CreateFile(lpFileName, dwDesiredAccess, dwShareMode, lpSecurityAttributes, dwCreationDisposition, dwFlagsAndAttributes, hTemplateFile); DPMDBGPRN1(" -> %#lx\n", ret); return(ret); } BOOL dpmDeleteFile(LPCSTR lpFileName) { PFAMILY_TABLE pFT = (PFAMILY_TABLE)TlsGetValue(dwTlsIndex); BOOL ret = 0; DPMDBGPRN("DeleteFile: "); ret = SHM_DeleteFile(lpFileName); DPMDBGPRN1(" -> %#lx\n", ret); return(ret); } BOOL dpmFindClose(HANDLE hFindFile) { PFAMILY_TABLE pFT = (PFAMILY_TABLE)TlsGetValue(dwTlsIndex); BOOL ret = 0; DPMDBGPRN("FindClose: "); ret = SHM_FindClose(hFindFile); DPMDBGPRN1(" -> %#lx\n", ret); return(ret); } BOOL dpmFindCloseChangeNotification(HANDLE hChangeHandle) { PFAMILY_TABLE pFT = (PFAMILY_TABLE)TlsGetValue(dwTlsIndex); BOOL ret = 0; DPMDBGPRN("FindCloseChangeNotification: "); ret = SHM_FindCloseChangeNotification(hChangeHandle); DPMDBGPRN1(" -> %#lx\n", ret); return(ret); } HANDLE dpmFindFirstChangeNotification(LPCSTR lpPathName, BOOL bWatchSubtree, DWORD dwNotifyFilter) { PFAMILY_TABLE pFT = (PFAMILY_TABLE)TlsGetValue(dwTlsIndex); HANDLE ret = 0; DPMDBGPRN("FindFirstChangeNotification: "); ret = SHM_FindFirstChangeNotification(lpPathName,bWatchSubtree,dwNotifyFilter); DPMDBGPRN1(" -> %#lx\n", ret); return(ret); } HANDLE dpmFindFirstFile(LPCSTR lpFileName, LPWIN32_FIND_DATA lpFindFileData) { PFAMILY_TABLE pFT = (PFAMILY_TABLE)TlsGetValue(dwTlsIndex); HANDLE ret = 0; DPMDBGPRN("FindFirstFile: "); ret = SHM_FindFirstFile(lpFileName, lpFindFileData); DPMDBGPRN1(" -> %#lx\n", ret); return(ret); } BOOL dpmFindNextChangeNotification(HANDLE hChangeHandle) { PFAMILY_TABLE pFT = (PFAMILY_TABLE)TlsGetValue(dwTlsIndex); BOOL ret = 0; DPMDBGPRN("FindNextChangeNotification: "); ret = SHM_FindNextChangeNotification(hChangeHandle); DPMDBGPRN1(" -> %#lx\n", ret); return(ret); } BOOL dpmFindNextFile(HANDLE hFindFile, LPWIN32_FIND_DATA lpFindFileData) { PFAMILY_TABLE pFT = (PFAMILY_TABLE)TlsGetValue(dwTlsIndex); BOOL ret = 0; DPMDBGPRN("FindNextFile: "); ret = SHM_FindNextFile(hFindFile, lpFindFileData); DPMDBGPRN1(" -> %#lx\n", ret); return(ret); } BOOL dpmFlushFileBuffers(HANDLE hFile) { PFAMILY_TABLE pFT = (PFAMILY_TABLE)TlsGetValue(dwTlsIndex); BOOL ret = 0; DPMDBGPRN("FlushFileBuffers: "); ret = SHM_FlushFileBuffers(hFile); DPMDBGPRN1(" -> %#lx\n", ret); return(ret); } DWORD dpmGetCurrentDirectory(DWORD nBufferLength, LPSTR lpBuffer) { PFAMILY_TABLE pFT = (PFAMILY_TABLE)TlsGetValue(dwTlsIndex); DWORD ret = 0; DPMDBGPRN("GetCurrentDirectory: "); ret = SHM_GetCurrentDirectory(nBufferLength, lpBuffer); DPMDBGPRN1(" -> %#lx\n", ret); return(ret); } BOOL dpmGetDiskFreeSpace(LPCSTR lpRootPathName, LPDWORD lpSectorsPerCluster, LPDWORD lpBytesPerSector, LPDWORD lpNumberOfFreeClusters, LPDWORD lpTotalNumberOfClusters) { PFAMILY_TABLE pFT = (PFAMILY_TABLE)TlsGetValue(dwTlsIndex); BOOL ret = 0; DPMDBGPRN("GetDiskFreeSpace: "); ret = SHM_GetDiskFreeSpace(lpRootPathName, lpSectorsPerCluster, lpBytesPerSector, lpNumberOfFreeClusters, lpTotalNumberOfClusters); DPMDBGPRN1(" -> %#lx\n", ret); return(ret); } BOOL dpmGetDiskFreeSpaceEx(LPCSTR lpDirectoryName, PULARGE_INTEGER lpFreeBytesAvailable, PULARGE_INTEGER lpTotalNumberOfBytes, PULARGE_INTEGER lpTotalNumberOfFreeBytes) { PFAMILY_TABLE pFT = (PFAMILY_TABLE)TlsGetValue(dwTlsIndex); BOOL ret = 0; DPMDBGPRN("GetDiskFreeSpaceEx: "); ret = SHM_GetDiskFreeSpaceEx(lpDirectoryName, lpFreeBytesAvailable, lpTotalNumberOfBytes, lpTotalNumberOfFreeBytes); DPMDBGPRN1(" -> %#lx\n", ret); return(ret); } UINT dpmGetDriveType(LPCSTR lpRootPathName) { PFAMILY_TABLE pFT = (PFAMILY_TABLE)TlsGetValue(dwTlsIndex); UINT ret = 0; DPMDBGPRN("GetDriveType: "); ret = SHM_GetDriveType(lpRootPathName); DPMDBGPRN1(" -> %#lx\n", ret); return(ret); } DWORD dpmGetFileAttributes(LPCSTR lpFileName) { PFAMILY_TABLE pFT = (PFAMILY_TABLE)TlsGetValue(dwTlsIndex); DWORD ret = 0; DPMDBGPRN("GetFileAttributes: "); ret = SHM_GetFileAttributes(lpFileName); DPMDBGPRN1(" -> %#lx\n", ret); return(ret); } BOOL dpmGetFileAttributesEx(LPCSTR lpFileName, GET_FILEEX_INFO_LEVELS fInfoLevelId, LPVOID lpFileInformation) { PFAMILY_TABLE pFT = (PFAMILY_TABLE)TlsGetValue(dwTlsIndex); BOOL ret = 0; DPMDBGPRN("GetFileAttributesEx: "); ret = SHM_GetFileAttributesEx(lpFileName, fInfoLevelId, lpFileInformation); DPMDBGPRN1(" -> %#lx\n", ret); return(ret); } BOOL dpmGetFileInformationByHandle(HANDLE hFile, LPBY_HANDLE_FILE_INFORMATION lpFileInformation) { PFAMILY_TABLE pFT = (PFAMILY_TABLE)TlsGetValue(dwTlsIndex); BOOL ret = 0; DPMDBGPRN("GetFileInformationByHandle: "); ret = SHM_GetFileInformationByHandle(hFile, lpFileInformation); DPMDBGPRN1(" -> %#lx\n", ret); return(ret); } DWORD dpmGetFileSize(HANDLE hFile, LPDWORD lpFileSizeHigh) { PFAMILY_TABLE pFT = (PFAMILY_TABLE)TlsGetValue(dwTlsIndex); DWORD ret = 0; DPMDBGPRN("GetFileSize: "); ret = SHM_GetFileSize(hFile, lpFileSizeHigh); DPMDBGPRN1(" -> %#lx\n", ret); return(ret); } DWORD dpmGetFileType(HANDLE hFile) { PFAMILY_TABLE pFT = (PFAMILY_TABLE)TlsGetValue(dwTlsIndex); DWORD ret = 0; DPMDBGPRN("GetFileType: "); ret = SHM_GetFileType(hFile); DPMDBGPRN1(" -> %#lx\n", ret); return(ret); } DWORD dpmGetFullPathName(LPCSTR lpFileName, DWORD nBufferLength, LPSTR lpBuffer, LPSTR *lpFilePart) { PFAMILY_TABLE pFT = (PFAMILY_TABLE)TlsGetValue(dwTlsIndex); DWORD ret = 0; DPMDBGPRN("GetFullPathName: "); ret = SHM_GetFullPathName(lpFileName, nBufferLength, lpBuffer, lpFilePart); DPMDBGPRN1(" -> %#lx\n", ret); return(ret); } DWORD dpmGetLogicalDrives(VOID) { PFAMILY_TABLE pFT = (PFAMILY_TABLE)TlsGetValue(dwTlsIndex); DWORD ret = 0; DPMDBGPRN("GetLogicalDrives: "); ret = SHM_GetLogicalDrives(); DPMDBGPRN(" -> void return\n"); return(ret); } DWORD dpmGetLogicalDriveStrings(DWORD nBufferLength, LPSTR lpBuffer) { PFAMILY_TABLE pFT = (PFAMILY_TABLE)TlsGetValue(dwTlsIndex); DWORD ret = 0; DPMDBGPRN("GetLogicalDriveStrings: "); ret = SHM_GetLogicalDriveStrings(nBufferLength, lpBuffer); DPMDBGPRN1(" -> %#lx\n", ret); return(ret); } DWORD dpmGetLongPathName(LPCSTR lpszShortPath, LPSTR lpszLongPath, DWORD cchBuffer) { PFAMILY_TABLE pFT = (PFAMILY_TABLE)TlsGetValue(dwTlsIndex); DWORD ret = 0; DPMDBGPRN("GetLongPathName: "); ret = SHM_GetLongPathName(lpszShortPath, lpszLongPath, cchBuffer); DPMDBGPRN1(" -> %#lx\n", ret); return(ret); } DWORD dpmGetShortPathName(LPCSTR lpszLongPath, LPSTR lpszShortPath, DWORD cchBuffer) { PFAMILY_TABLE pFT = (PFAMILY_TABLE)TlsGetValue(dwTlsIndex); DWORD ret = 0; DPMDBGPRN("GetShortPathName: "); ret = SHM_GetShortPathName(lpszLongPath, lpszShortPath, cchBuffer); DPMDBGPRN1(" -> %#lx\n", ret); return(ret); } DWORD dpmGetTempPath(DWORD nBufferLength, LPSTR lpBuffer) { PFAMILY_TABLE pFT = (PFAMILY_TABLE)TlsGetValue(dwTlsIndex); DWORD ret = 0; DPMDBGPRN("GetTempPath: "); ret = SHM_GetTempPath(nBufferLength, lpBuffer); DPMDBGPRN1(" -> %#lx\n", ret); return(ret); } BOOL dpmLockFile(HANDLE hFile, DWORD dwFileOffsetLow, DWORD dwFileOffsetHigh, DWORD nNumberOfBytesToLockLow, DWORD nNumberOfBytesToLockHigh) { PFAMILY_TABLE pFT = (PFAMILY_TABLE)TlsGetValue(dwTlsIndex); BOOL ret = 0; DPMDBGPRN("LockFile: "); ret = SHM_LockFile(hFile, dwFileOffsetLow, dwFileOffsetHigh, nNumberOfBytesToLockLow, nNumberOfBytesToLockHigh); DPMDBGPRN1(" -> %#lx\n", ret); return(ret); } BOOL dpmMoveFile(LPCSTR lpExistingFileName, LPCSTR lpNewFileName) { PFAMILY_TABLE pFT = (PFAMILY_TABLE)TlsGetValue(dwTlsIndex); BOOL ret = 0; DPMDBGPRN("MoveFile: "); ret = SHM_MoveFile(lpExistingFileName, lpNewFileName); DPMDBGPRN1(" -> %#lx\n", ret); return(ret); } BOOL dpmMoveFileEx(LPCSTR lpExistingFileName, LPCSTR lpNewFileName, DWORD dwFlags) { PFAMILY_TABLE pFT = (PFAMILY_TABLE)TlsGetValue(dwTlsIndex); BOOL ret = 0; DPMDBGPRN("MoveFileEx: "); ret = SHM_MoveFileEx(lpExistingFileName, lpNewFileName, dwFlags); DPMDBGPRN1(" -> %#lx\n", ret); return(ret); } DWORD dpmQueryDosDevice(LPCSTR lpDeviceName, LPSTR lpTargetPath, DWORD ucchMax) { PFAMILY_TABLE pFT = (PFAMILY_TABLE)TlsGetValue(dwTlsIndex); DWORD ret = 0; DPMDBGPRN("QueryDosDevice: "); ret = SHM_QueryDosDevice(lpDeviceName, lpTargetPath, ucchMax); DPMDBGPRN1(" -> %#lx\n", ret); return(ret); } BOOL dpmReadFile(HANDLE hFile, LPVOID lpBuffer, DWORD nNumberOfBytesToRead, LPDWORD lpNumberOfBytesRead, LPOVERLAPPED lpOverlapped) { PFAMILY_TABLE pFT = (PFAMILY_TABLE)TlsGetValue(dwTlsIndex); BOOL ret = 0; DPMDBGPRN("ReadFile: "); ret = SHM_ReadFile(hFile, lpBuffer, nNumberOfBytesToRead, lpNumberOfBytesRead, lpOverlapped); DPMDBGPRN1(" -> %#lx\n", ret); return(ret); } BOOL dpmReadFileEx(HANDLE hFile, LPVOID lpBuffer, DWORD nNumberOfBytesToRead, LPOVERLAPPED lpOverlapped, LPOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine) { PFAMILY_TABLE pFT = (PFAMILY_TABLE)TlsGetValue(dwTlsIndex); BOOL ret = 0; DPMDBGPRN("ReadFileEx: "); ret = SHM_ReadFileEx(hFile, lpBuffer, nNumberOfBytesToRead, lpOverlapped, lpCompletionRoutine); DPMDBGPRN1(" -> %#lx\n", ret); return(ret); } BOOL dpmRemoveDirectory(LPCSTR lpPathName) { PFAMILY_TABLE pFT = (PFAMILY_TABLE)TlsGetValue(dwTlsIndex); BOOL ret = 0; DPMDBGPRN("RemoveDirectory: "); ret = SHM_RemoveDirectory(lpPathName); DPMDBGPRN1(" -> %#lx\n", ret); return(ret); } DWORD dpmSearchPath(LPCSTR lpPath, LPCSTR lpFileName, LPCSTR lpExtension, DWORD nBufferLength, LPSTR lpBuffer, LPSTR *lpFilePart) { PFAMILY_TABLE pFT = (PFAMILY_TABLE)TlsGetValue(dwTlsIndex); DWORD ret = 0; DPMDBGPRN("SearchPath: "); ret = SHM_SearchPath(lpPath, lpFileName, lpExtension, nBufferLength, lpBuffer, lpFilePart); DPMDBGPRN1(" -> %#lx\n", ret); return(ret); } BOOL dpmSetCurrentDirectory(LPCSTR lpPathName) { PFAMILY_TABLE pFT = (PFAMILY_TABLE)TlsGetValue(dwTlsIndex); BOOL ret = 0; DPMDBGPRN("SetCurrentDirectory: "); ret = SHM_SetCurrentDirectory(lpPathName); DPMDBGPRN1(" -> %#lx\n", ret); return(ret); } BOOL dpmSetEndOfFile(HANDLE hFile) { PFAMILY_TABLE pFT = (PFAMILY_TABLE)TlsGetValue(dwTlsIndex); BOOL ret = 0; DPMDBGPRN("SetEndOfFile: "); ret = SHM_SetEndOfFile(hFile); DPMDBGPRN1(" -> %#lx\n", ret); return(ret); } VOID dpmSetFileApisToANSI(VOID) { PFAMILY_TABLE pFT = (PFAMILY_TABLE)TlsGetValue(dwTlsIndex); DPMDBGPRN("SetFileApisToANSI: "); SetFileApisToANSI(); DPMDBGPRN(" -> Void return"); } VOID dpmSetFileApisToOEM(VOID) { PFAMILY_TABLE pFT = (PFAMILY_TABLE)TlsGetValue(dwTlsIndex); DPMDBGPRN("SetFileApisToOEM: "); SetFileApisToOEM(); DPMDBGPRN(" -> Void return"); } BOOL dpmSetFileAttributes(LPCSTR lpFileName, DWORD dwFileAttributes) { PFAMILY_TABLE pFT = (PFAMILY_TABLE)TlsGetValue(dwTlsIndex); BOOL ret = 0; DPMDBGPRN("SetFileAttributes: "); ret = SHM_SetFileAttributes(lpFileName, dwFileAttributes); DPMDBGPRN1(" -> %#lx\n", ret); return(ret); } DWORD dpmSetFilePointer(HANDLE hFile, LONG lDistanceToMove, PLONG lpDistanceToMoveHigh, DWORD dwMoveMethod) { PFAMILY_TABLE pFT = (PFAMILY_TABLE)TlsGetValue(dwTlsIndex); DWORD ret = 0; DPMDBGPRN("SetFilePointer: "); ret = SHM_SetFilePointer(hFile, lDistanceToMove, lpDistanceToMoveHigh, dwMoveMethod); DPMDBGPRN1(" -> %#lx\n", ret); return(ret); } BOOL dpmSetVolumeLabel(LPCSTR lpRootPathName, LPCSTR lpVolumeName) { PFAMILY_TABLE pFT = (PFAMILY_TABLE)TlsGetValue(dwTlsIndex); BOOL ret = 0; DPMDBGPRN("SetVolumeLabel: "); ret = SHM_SetVolumeLabel(lpRootPathName, lpVolumeName); DPMDBGPRN1(" -> %#lx\n", ret); return(ret); } BOOL dpmUnlockFile(HANDLE hFile, DWORD dwFileOffsetLow, DWORD dwFileOffsetHigh, DWORD nNumberOfBytesToUnlockLow, DWORD nNumberOfBytesToUnlockHigh) { PFAMILY_TABLE pFT = (PFAMILY_TABLE)TlsGetValue(dwTlsIndex); BOOL ret = 0; DPMDBGPRN("UnlockFile: "); ret = SHM_UnlockFile(hFile, dwFileOffsetLow, dwFileOffsetHigh, nNumberOfBytesToUnlockLow, nNumberOfBytesToUnlockHigh); DPMDBGPRN1(" -> %#lx\n", ret); return(ret); } BOOL dpmWriteFile(HANDLE hFile, LPCVOID lpBuffer, DWORD nNumberOfBytesToWrite, LPDWORD lpNumberOfBytesWritten, LPOVERLAPPED lpOverlapped) { PFAMILY_TABLE pFT = (PFAMILY_TABLE)TlsGetValue(dwTlsIndex); BOOL ret = 0; DPMDBGPRN("WriteFile: "); ret = SHM_WriteFile(hFile, lpBuffer, nNumberOfBytesToWrite, lpNumberOfBytesWritten, lpOverlapped); DPMDBGPRN1(" -> %#lx\n", ret); return(ret); } BOOL dpmWriteFileEx(HANDLE hFile, LPCVOID lpBuffer, DWORD nNumberOfBytesToWrite, LPOVERLAPPED lpOverlapped, LPOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine) { PFAMILY_TABLE pFT = (PFAMILY_TABLE)TlsGetValue(dwTlsIndex); BOOL ret = 0; DPMDBGPRN("WriteFileEx: "); ret = SHM_WriteFileEx(hFile, lpBuffer, nNumberOfBytesToWrite, lpOverlapped, lpCompletionRoutine); DPMDBGPRN1(" -> %#lx\n", ret); return(ret); } /* VOID CALLBACK dpmFileIOCompletionRoutine(DWORD dwErrorCode, DWORD dwNumberOfBytesTransfered, LPOVERLAPPED lpOverlapped) { PFAMILY_TABLE pFT = (PFAMILY_TABLE)TlsGetValue(dwTlsIndex); DPMDBGPRN("FileIOCompletionRoutine: "); FileIOCompletionRoutine(dwErrorCode, dwNumberOfBytesTransfered, lpOverlapped); DPMDBGPRN(" -> void return\n"); } */ UINT dpmGetTempFileNameW(LPCWSTR lpPathName, LPCWSTR lpPrefixString, UINT uUnique, LPWSTR lpTempFileName) { PFAMILY_TABLE pFT = (PFAMILY_TABLE)TlsGetValue(dwTlsIndex); LONG ret = 0; DPMDBGPRN("GetTempFileNameW: "); ret = SHM_GetTempFileNameW(lpPathName, lpPrefixString, uUnique, lpTempFileName); DPMDBGPRN1(" -> %ld\n", ret); return(ret); } BOOL dpmCopyFileW(LPCWSTR lpExistingFileName, LPCWSTR lpNewFileName, BOOL bFailIfExists) { PFAMILY_TABLE pFT = (PFAMILY_TABLE)TlsGetValue(dwTlsIndex); BOOL ret = 0; DPMDBGPRN("CopyFileW: "); ret = SHM_CopyFileW(lpExistingFileName, lpNewFileName, bFailIfExists); DPMDBGPRN1(" -> %#lx\n", ret); return(ret); } BOOL dpmCopyFileExW(LPCWSTR lpExistingFileName, LPCWSTR lpNewFileName, LPPROGRESS_ROUTINE lpProgressRoutine, LPVOID lpData, LPBOOL pbCancel, DWORD dwCopyFlags) { PFAMILY_TABLE pFT = (PFAMILY_TABLE)TlsGetValue(dwTlsIndex); BOOL ret = 0; DPMDBGPRN("CopyFileExW: "); ret = SHM_CopyFileExW(lpExistingFileName, lpNewFileName, lpProgressRoutine, lpData, pbCancel, dwCopyFlags); DPMDBGPRN1(" -> %#lx\n", ret); return(ret); } BOOL dpmCreateDirectoryW(LPCWSTR lpPathName, LPSECURITY_ATTRIBUTES lpSecurityAttributes) { PFAMILY_TABLE pFT = (PFAMILY_TABLE)TlsGetValue(dwTlsIndex); BOOL ret = 0; DPMDBGPRN("CreateDirectoryW: "); ret = SHM_CreateDirectoryW(lpPathName, lpSecurityAttributes); DPMDBGPRN1(" -> %#lx\n", ret); return(ret); } BOOL dpmCreateDirectoryExW(LPCWSTR lpTemplateDirectory, LPCWSTR lpNewDirectory, LPSECURITY_ATTRIBUTES lpSecurityAttributes) { PFAMILY_TABLE pFT = (PFAMILY_TABLE)TlsGetValue(dwTlsIndex); BOOL ret = 0; DPMDBGPRN("CreateDirectoryExW: "); ret = SHM_CreateDirectoryExW(lpTemplateDirectory, lpNewDirectory, lpSecurityAttributes); DPMDBGPRN1(" -> %#lx\n", ret); return(ret); } HANDLE dpmCreateFileW(LPCWSTR lpFileName, DWORD dwDesiredAccess, DWORD dwShareMode, LPSECURITY_ATTRIBUTES lpSecurityAttributes, DWORD dwCreationDisposition, DWORD dwFlagsAndAttributes, HANDLE hTemplateFile) { PFAMILY_TABLE pFT = (PFAMILY_TABLE)TlsGetValue(dwTlsIndex); HANDLE ret = 0; DPMDBGPRN("CreateFileW: "); ret = SHM_CreateFileW(lpFileName, dwDesiredAccess, dwShareMode, lpSecurityAttributes, dwCreationDisposition, dwFlagsAndAttributes, hTemplateFile); DPMDBGPRN1(" -> %#lx\n", ret); return(ret); } BOOL dpmDeleteFileW(LPCWSTR lpFileName) { PFAMILY_TABLE pFT = (PFAMILY_TABLE)TlsGetValue(dwTlsIndex); BOOL ret = 0; DPMDBGPRN("DeleteFileW: "); ret = SHM_DeleteFileW(lpFileName); DPMDBGPRN1(" -> %#lx\n", ret); return(ret); } HANDLE dpmFindFirstFileW(LPCWSTR lpFileName, LPWIN32_FIND_DATAW lpFindFileData) { PFAMILY_TABLE pFT = (PFAMILY_TABLE)TlsGetValue(dwTlsIndex); HANDLE ret = 0; DPMDBGPRN("FindFirstFileW: "); ret = SHM_FindFirstFileW(lpFileName, lpFindFileData); DPMDBGPRN1(" -> %#lx\n", ret); return(ret); } BOOL dpmFindNextFileW(HANDLE hFindFile, LPWIN32_FIND_DATAW lpFindFileData) { PFAMILY_TABLE pFT = (PFAMILY_TABLE)TlsGetValue(dwTlsIndex); BOOL ret = 0; DPMDBGPRN("FindNextFileW: "); ret = SHM_FindNextFileW(hFindFile, lpFindFileData); DPMDBGPRN1(" -> %#lx\n", ret); return(ret); } DWORD dpmGetCurrentDirectoryW(DWORD nBufferLength, LPWSTR lpBuffer) { PFAMILY_TABLE pFT = (PFAMILY_TABLE)TlsGetValue(dwTlsIndex); DWORD ret = 0; DPMDBGPRN("GetCurrentDirectoryW: "); ret = SHM_GetCurrentDirectoryW(nBufferLength, lpBuffer); DPMDBGPRN1(" -> %#lx\n", ret); return(ret); } BOOL dpmGetDiskFreeSpaceW(LPCWSTR lpRootPathName, LPDWORD lpSectorsPerCluster, LPDWORD lpBytesPerSector, LPDWORD lpNumberOfFreeClusters, LPDWORD lpTotalNumberOfClusters) { PFAMILY_TABLE pFT = (PFAMILY_TABLE)TlsGetValue(dwTlsIndex); BOOL ret = 0; DPMDBGPRN("GetDiskFreeSpaceW: "); ret = SHM_GetDiskFreeSpaceW(lpRootPathName, lpSectorsPerCluster, lpBytesPerSector, lpNumberOfFreeClusters, lpTotalNumberOfClusters); DPMDBGPRN1(" -> %#lx\n", ret); return(ret); } BOOL dpmGetDiskFreeSpaceExW(LPCWSTR lpDirectoryName, PULARGE_INTEGER lpFreeBytesAvailable, PULARGE_INTEGER lpTotalNumberOfBytes, PULARGE_INTEGER lpTotalNumberOfFreeBytes) { PFAMILY_TABLE pFT = (PFAMILY_TABLE)TlsGetValue(dwTlsIndex); BOOL ret = 0; DPMDBGPRN("GetDiskFreeSpaceExW: "); ret = SHM_GetDiskFreeSpaceExW(lpDirectoryName, lpFreeBytesAvailable, lpTotalNumberOfBytes, lpTotalNumberOfFreeBytes); DPMDBGPRN1(" -> %#lx\n", ret); return(ret); } UINT dpmGetDriveTypeW(LPCWSTR lpRootPathName) { PFAMILY_TABLE pFT = (PFAMILY_TABLE)TlsGetValue(dwTlsIndex); UINT ret = 0; DPMDBGPRN("GetDriveTypeW: "); ret = SHM_GetDriveTypeW(lpRootPathName); DPMDBGPRN1(" -> %#lx\n", ret); return(ret); } DWORD dpmGetFileAttributesW(LPCWSTR lpFileName) { PFAMILY_TABLE pFT = (PFAMILY_TABLE)TlsGetValue(dwTlsIndex); DWORD ret = 0; DPMDBGPRN("GetFileAttributesW: "); ret = SHM_GetFileAttributesW(lpFileName); DPMDBGPRN1(" -> %#lx\n", ret); return(ret); } BOOL dpmGetFileAttributesExW(LPCWSTR lpFileName, GET_FILEEX_INFO_LEVELS fInfoLevelId, LPVOID lpFileInformation) { PFAMILY_TABLE pFT = (PFAMILY_TABLE)TlsGetValue(dwTlsIndex); BOOL ret = 0; DPMDBGPRN("GetFileAttributesExW: "); ret = SHM_GetFileAttributesExW(lpFileName, fInfoLevelId, lpFileInformation); DPMDBGPRN1(" -> %#lx\n", ret); return(ret); } DWORD dpmGetFullPathNameW(LPCWSTR lpFileName, DWORD nBufferLength, LPWSTR lpBuffer, LPWSTR *lpFilePart) { PFAMILY_TABLE pFT = (PFAMILY_TABLE)TlsGetValue(dwTlsIndex); DWORD ret = 0; DPMDBGPRN("GetFullPathNameW: "); ret = SHM_GetFullPathNameW(lpFileName, nBufferLength, lpBuffer, lpFilePart); DPMDBGPRN1(" -> %#lx\n", ret); return(ret); } DWORD dpmGetLogicalDriveStringsW(DWORD nBufferLength, LPWSTR lpBuffer) { PFAMILY_TABLE pFT = (PFAMILY_TABLE)TlsGetValue(dwTlsIndex); DWORD ret = 0; DPMDBGPRN("GetLogicalDriveStringsW: "); ret = SHM_GetLogicalDriveStringsW(nBufferLength, lpBuffer); DPMDBGPRN1(" -> %#lx\n", ret); return(ret); } DWORD dpmGetLongPathNameW(LPCWSTR lpszShortPath, LPWSTR lpszLongPath, DWORD cchBuffer) { PFAMILY_TABLE pFT = (PFAMILY_TABLE)TlsGetValue(dwTlsIndex); DWORD ret = 0; DPMDBGPRN("GetLongPathNameW: "); ret = SHM_GetLongPathNameW(lpszShortPath, lpszLongPath, cchBuffer); DPMDBGPRN1(" -> %#lx\n", ret); return(ret); } DWORD dpmGetShortPathNameW(LPCWSTR lpszLongPath, LPWSTR lpszShortPath, DWORD cchBuffer) { PFAMILY_TABLE pFT = (PFAMILY_TABLE)TlsGetValue(dwTlsIndex); DWORD ret = 0; DPMDBGPRN("GetShortPathNameW: "); ret = SHM_GetShortPathNameW(lpszLongPath, lpszShortPath, cchBuffer); DPMDBGPRN1(" -> %#lx\n", ret); return(ret); } DWORD dpmGetTempPathW(DWORD nBufferLength, LPWSTR lpBuffer) { PFAMILY_TABLE pFT = (PFAMILY_TABLE)TlsGetValue(dwTlsIndex); DWORD ret = 0; DPMDBGPRN("GetTempPathW: "); ret = SHM_GetTempPathW(nBufferLength, lpBuffer); DPMDBGPRN1(" -> %#lx\n", ret); return(ret); } BOOL dpmMoveFileW(LPCWSTR lpExistingFileName, LPCWSTR lpNewFileName) { PFAMILY_TABLE pFT = (PFAMILY_TABLE)TlsGetValue(dwTlsIndex); BOOL ret = 0; DPMDBGPRN("MoveFileW: "); ret = SHM_MoveFileW(lpExistingFileName, lpNewFileName); DPMDBGPRN1(" -> %#lx\n", ret); return(ret); } BOOL dpmMoveFileExW(LPCWSTR lpExistingFileName, LPCWSTR lpNewFileName, DWORD dwFlags) { PFAMILY_TABLE pFT = (PFAMILY_TABLE)TlsGetValue(dwTlsIndex); BOOL ret = 0; DPMDBGPRN("MoveFileExW: "); ret = SHM_MoveFileExW(lpExistingFileName, lpNewFileName, dwFlags); DPMDBGPRN1(" -> %#lx\n", ret); return(ret); } DWORD dpmQueryDosDeviceW(LPCWSTR lpDeviceName, LPWSTR lpTargetPath, DWORD ucchMax) { PFAMILY_TABLE pFT = (PFAMILY_TABLE)TlsGetValue(dwTlsIndex); DWORD ret = 0; DPMDBGPRN("QueryDosDeviceW: "); ret = SHM_QueryDosDeviceW(lpDeviceName, lpTargetPath, ucchMax); DPMDBGPRN1(" -> %#lx\n", ret); return(ret); } BOOL dpmRemoveDirectoryW(LPCWSTR lpPathName) { PFAMILY_TABLE pFT = (PFAMILY_TABLE)TlsGetValue(dwTlsIndex); BOOL ret = 0; DPMDBGPRN("RemoveDirectoryW: "); ret = SHM_RemoveDirectoryW(lpPathName); DPMDBGPRN1(" -> %#lx\n", ret); return(ret); } DWORD dpmSearchPathW(LPCWSTR lpPath, LPCWSTR lpFileName, LPCWSTR lpExtension, DWORD nBufferLength, LPWSTR lpBuffer, LPWSTR *lpFilePart) { PFAMILY_TABLE pFT = (PFAMILY_TABLE)TlsGetValue(dwTlsIndex); DWORD ret = 0; DPMDBGPRN("SearchPathW: "); ret = SHM_SearchPathW(lpPath, lpFileName, lpExtension, nBufferLength, lpBuffer, lpFilePart); DPMDBGPRN1(" -> %#lx\n", ret); return(ret); } BOOL dpmSetCurrentDirectoryW(LPCWSTR lpPathName) { PFAMILY_TABLE pFT = (PFAMILY_TABLE)TlsGetValue(dwTlsIndex); BOOL ret = 0; DPMDBGPRN("SetCurrentDirectoryW: "); ret = SHM_SetCurrentDirectoryW(lpPathName); DPMDBGPRN1(" -> %#lx\n", ret); return(ret); } BOOL dpmSetFileAttributesW(LPCWSTR lpFileName, DWORD dwFileAttributes) { PFAMILY_TABLE pFT = (PFAMILY_TABLE)TlsGetValue(dwTlsIndex); BOOL ret = 0; DPMDBGPRN("SetFileAttributesW: "); ret = SHM_SetFileAttributesW(lpFileName, dwFileAttributes); DPMDBGPRN1(" -> %#lx\n", ret); return(ret); } BOOL dpmSetVolumeLabelW(LPCWSTR lpRootPathName, LPCWSTR lpVolumeName) { PFAMILY_TABLE pFT = (PFAMILY_TABLE)TlsGetValue(dwTlsIndex); BOOL ret = 0; DPMDBGPRN("SetVolumeLabelW: "); ret = SHM_SetVolumeLabelW(lpRootPathName, lpVolumeName); DPMDBGPRN1(" -> %#lx\n", ret); return(ret); }