• <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  評(píng)論-262  文章-1  trackbacks-0
            主要思路:
            1. 調(diào)用 GetFileInformationByHandle  函數(shù)得到指定文件句柄的相應(yīng)文件信息, 再調(diào)用 GetLogicalDriveStrings 函數(shù)得到所有驅(qū)動(dòng)器盤(pán)符, 用 GetVolumeInformation 函數(shù)遍歷每個(gè)盤(pán)符, 取得盤(pán)符的卷序列號(hào), 然后與前一步得到的文件信息比較, 找到該文件的盤(pán)符.
            2. 調(diào)用 ZwQueryInformationFile 函數(shù), 得到文件句柄的文件路徑, 這個(gè)路徑是沒(méi)有盤(pán)符的, 將步驟1得到的盤(pán)符加在這個(gè)路徑的前邊, 就得到了整個(gè)路徑了. 以下是實(shí)現(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 閱讀(6532) 評(píng)論(0)  編輯 收藏 引用

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


            免费精品久久天干天干| 久久精品国产亚洲AV大全| 97久久香蕉国产线看观看| 久久精品国产亚洲AV麻豆网站 | 漂亮人妻被中出中文字幕久久| 久久精品极品盛宴观看| 亚洲国产精品无码久久久蜜芽| 久久精品天天中文字幕人妻 | 色欲久久久天天天综合网精品| 久久久无码精品亚洲日韩按摩| 99久久精品免费看国产| 亚洲精品无码久久千人斩| 狠狠色丁香久久综合五月| 伊人久久大香线焦AV综合影院| 久久99精品国产麻豆婷婷| 国产成人久久精品一区二区三区 | 91精品国产9l久久久久| 午夜精品久久久内射近拍高清 | 亚洲欧美日韩中文久久| 999久久久国产精品| 亚洲AV日韩精品久久久久| 久久人人爽人爽人人爽av| 久久嫩草影院免费看夜色| 国产产无码乱码精品久久鸭| 精品永久久福利一区二区| 欧美精品乱码99久久蜜桃| 99久久99久久精品国产| 99久久精品影院老鸭窝| 99精品国产99久久久久久97| 香蕉99久久国产综合精品宅男自 | 狠狠狠色丁香婷婷综合久久俺| 日韩精品久久久久久久电影| 曰曰摸天天摸人人看久久久| 国产午夜精品理论片久久影视| 婷婷久久久亚洲欧洲日产国码AV| 久久久久国色AV免费看图片| 国内精品伊人久久久久影院对白| 久久国产精品一国产精品金尊| 色婷婷久久综合中文久久蜜桃av| 久久综合久久自在自线精品自| 久久综合鬼色88久久精品综合自在自线噜噜 |