• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            隨筆-60  評論-262  文章-1  trackbacks-0
            主要思路:
            1. 調(diào)用 GetFileInformationByHandle  函數(shù)得到指定文件句柄的相應(yīng)文件信息, 再調(diào)用 GetLogicalDriveStrings 函數(shù)得到所有驅(qū)動器盤符, 用 GetVolumeInformation 函數(shù)遍歷每個盤符, 取得盤符的卷序列號, 然后與前一步得到的文件信息比較, 找到該文件的盤符.
            2. 調(diào)用 ZwQueryInformationFile 函數(shù), 得到文件句柄的文件路徑, 這個路徑是沒有盤符的, 將步驟1得到的盤符加在這個路徑的前邊, 就得到了整個路徑了. 以下是實現(xiàn)代碼.

            handle2path.h
            #pragma once

            #ifndef _countof
            #define _countof(array) (sizeof(array)/sizeof((array)[0]))
            #endif 

            EXTERN_C BOOL GetFilePathFromHandleW(HANDLE hFile, LPWSTR lpszPath, UINT cchMax);
            EXTERN_C BOOL GetFilePathFromHandleA(HANDLE hFile, LPSTR  lpszPath, UINT cchMax);

            #ifdef UNICODE
            #define GetFilePathFromHandle GetFilePathFromHandleW
            #else
            #define GetFilePathFromHandle GetFilePathFromHandleA
            #endif


            handle2path.c

            #include <Windows.h>
            #include 
            <tchar.h>
            #include 
            <shlwapi.h>
            #pragma comment(lib, 
            "shlwapi")

            #include 
            "handle2path.h"


            EXTERN_C BOOL GetVolumeNameByHandle(HANDLE hFile, LPWSTR szVolumeName, UINT cchMax)
            {
                BOOL bResult 
            = FALSE;
                WCHAR szBuf[
            500= { 0 };
                WCHAR 
            * pIter = szBuf;
                
            int i = 0;
                BY_HANDLE_FILE_INFORMATION stFileInfo 
            = { 0 };
                
                
            do 
                {
                    
            if(FALSE == GetFileInformationByHandle(hFile, &stFileInfo)) {
                        
            break;
                    }
                    
                    
            if(0 == GetLogicalDriveStringsW(_countof(szBuf), szBuf)) {
                        
            break;
                    }
                    
                    
            for(; pIter; pIter+=4)
                    {
                        DWORD dwVolumeSerialNumber 
            = 0;
                        
                        
            if(GetVolumeInformationW(pIter, NULL, 0&dwVolumeSerialNumber, 
                            NULL, NULL, NULL, 
            0))
                        {
                            
            if(dwVolumeSerialNumber == stFileInfo.dwVolumeSerialNumber)
                            {
                                lstrcpynW(szVolumeName, pIter, cchMax);
                                bResult 
            = TRUE;
                                
            break;
                            }
                        }
                    }
                    
                } 
            while (FALSE);
                
                
            return bResult;
            }



            typedef 
            struct _IO_STATUS_BLOCK {
                LONG Status;
                LONG Information;
            } IO_STATUS_BLOCK, 
            *PIO_STATUS_BLOCK;

            typedef 
            struct _FILE_NAME_INFORMATION {
                ULONG FileNameLength;
                WCHAR FileName[MAX_PATH];
            } FILE_NAME_INFORMATION;

            __declspec(dllimport) LONG __stdcall ZwQueryInformationFile (
                                                                         IN HANDLE FileHandle,
                                                                         OUT PIO_STATUS_BLOCK IoStatusBlock,
                                                                         OUT PVOID FileInformation,
                                                                         IN ULONG FileInformationLength,
                                                                         IN ULONG FileInformationClass
                                                                         );

            typedef LONG (__stdcall 
            * PFN_ZwQueryInformationFile) (
                                                                   IN HANDLE FileHandle,
                                                                   OUT PIO_STATUS_BLOCK IoStatusBlock,
                                                                   OUT PVOID FileInformation,
                                                                   IN ULONG FileInformationLength,
                                                                   IN ULONG FileInformationClass
                                                                   );


            EXTERN_C BOOL GetFilePathFromHandleW(HANDLE hFile, LPWSTR lpszPath, UINT cchMax)
            {
                BOOL bResult 
            = FALSE;
                WCHAR szValue[MAX_PATH] 
            = { 0 };
                
                IO_STATUS_BLOCK    isb 
            = { 0 };
                FILE_NAME_INFORMATION fni 
            = { 0 };
                HANDLE hNtDll 
            = NULL;
                PFN_ZwQueryInformationFile pfn_ZwQueryInformationFile 
            = NULL;
                
                
            do 
                {
                    
            if (INVALID_HANDLE_VALUE==hFile || NULL==lpszPath || 0==cchMax) {
                        
            break;
                    }

                    hNtDll 
            = GetModuleHandle(_T("ntdll.dll")); 
                    
            if (NULL == hNtDll) {
                        
            break;
                    }

                    pfn_ZwQueryInformationFile 
            = (PFN_ZwQueryInformationFile)
                        GetProcAddress(hNtDll, 
            "ZwQueryInformationFile");
                    
            if (NULL == pfn_ZwQueryInformationFile) {
                        
            break;
                    }
                    
                    
            // 9 == FileNameInformation
                    if (0 != pfn_ZwQueryInformationFile(hFile, &isb, &fni, sizeof(fni), 9)) {
                        
            break;
                    }
                    
                    
            if (FALSE == GetVolumeNameByHandle(hFile, szValue, _countof(szValue))) {
                        
            break;
                    }

                    PathAppendW(szValue, fni.FileName);

                    lstrcpynW(lpszPath, szValue, cchMax);
                    
                    bResult 
            = TRUE;
                } 
            while (FALSE);
                
            return bResult;
            }

            EXTERN_C BOOL GetFilePathFromHandleA(HANDLE hFile, LPSTR  lpszPath, UINT cchMax)
            {
                BOOL bResult 
            = FALSE;
                WCHAR szTmep[MAX_PATH] 
            = { 0 };
                
                
            do 
                {
                    
            if (INVALID_HANDLE_VALUE==hFile || NULL==lpszPath || 0==cchMax) {
                        
            break;
                    }
                    
                    
            if (FALSE == GetFilePathFromHandleW(hFile, szTmep, _countof(szTmep))) {
                        
            break;
                    }
                    
                    
            if (0 == WideCharToMultiByte(CP_ACP, 0
                        szTmep, lstrlenW(szTmep), 
                        lpszPath, cchMax, NULL, NULL)) 
                    {
                        
            break;
                    }

                    bResult 
            = TRUE;
                } 
            while (FALSE);
                
            return bResult;
            }

            posted on 2009-07-16 16:01 free2000fly 閱讀(6522) 評論(0)  編輯 收藏 引用

            只有注冊用戶登錄后才能發(fā)表評論。
            網(wǎng)站導(dǎo)航: 博客園   IT新聞   BlogJava   博問   Chat2DB   管理


            无夜精品久久久久久| 亚洲人成网站999久久久综合| 国产成人香蕉久久久久| 精品久久综合1区2区3区激情| 亚洲精品久久久www| 久久久久久久波多野结衣高潮 | 日产精品久久久一区二区| 国产精品九九久久免费视频| 深夜久久AAAAA级毛片免费看| 亚洲欧美日韩中文久久| 伊人精品久久久久7777| 久久午夜羞羞影院免费观看| 亚洲午夜久久影院| 亚洲人成无码www久久久| 看久久久久久a级毛片| 久久久久亚洲AV无码去区首| 嫩草影院久久99| 大美女久久久久久j久久| 久久天天躁狠狠躁夜夜不卡| 国产亚洲精午夜久久久久久| 久久久精品人妻一区二区三区四| 亚洲精品无码成人片久久| 精品水蜜桃久久久久久久| 色妞色综合久久夜夜| 久久伊人五月丁香狠狠色| 综合人妻久久一区二区精品| 久久久国产打桩机| 久久精品无码一区二区三区免费| 色婷婷综合久久久久中文字幕| 国产精品99精品久久免费| 97热久久免费频精品99| 99久久国产免费福利| 国产成人久久AV免费| www久久久天天com| 99久久99久久精品免费看蜜桃| 久久久精品国产免大香伊| 久久人妻无码中文字幕| 久久午夜福利无码1000合集| 99久久精品免费看国产一区二区三区| 久久精品99无色码中文字幕| 精品久久久久国产免费|