• <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. 調用 GetFileInformationByHandle  函數得到指定文件句柄的相應文件信息, 再調用 GetLogicalDriveStrings 函數得到所有驅動器盤符, 用 GetVolumeInformation 函數遍歷每個盤符, 取得盤符的卷序列號, 然后與前一步得到的文件信息比較, 找到該文件的盤符.
            2. 調用 ZwQueryInformationFile 函數, 得到文件句柄的文件路徑, 這個路徑是沒有盤符的, 將步驟1得到的盤符加在這個路徑的前邊, 就得到了整個路徑了. 以下是實現代碼.

            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 閱讀(6533) 評論(0)  編輯 收藏 引用
            欧美va久久久噜噜噜久久| 国产精品18久久久久久vr| 久久久久亚洲av毛片大| 日本精品久久久久久久久免费| 久久天天躁狠狠躁夜夜2020 | 久久青草国产手机看片福利盒子| 久久夜色精品国产欧美乱| 久久青青草原国产精品免费| 亚洲国产成人精品久久久国产成人一区二区三区综| 国产精品成人精品久久久| 久久久噜噜噜久久中文字幕色伊伊 | 99久久精品九九亚洲精品| 亚洲色欲久久久久综合网| 国内精品久久久久久99| 亚洲欧美另类日本久久国产真实乱对白| 亚洲AV成人无码久久精品老人 | 久久久久av无码免费网| 人人狠狠综合久久亚洲88| 狠狠色噜噜色狠狠狠综合久久| 久久国产精品久久国产精品| 性做久久久久久久久| 国产亚洲欧美成人久久片 | 亚洲国产精品成人久久蜜臀| 国产精品久久久久久搜索| 色综合久久综合中文综合网| 理论片午午伦夜理片久久 | 久久久WWW成人免费毛片| 国产精品女同久久久久电影院| 久久久久se色偷偷亚洲精品av| 久久久久国产一级毛片高清板| 亚洲国产成人久久综合碰碰动漫3d | 国产精品无码久久久久| 99久久99这里只有免费的精品| 亚洲欧美日韩中文久久| 久久久久久午夜精品| 亚洲国产日韩综合久久精品| 亚洲综合久久夜AV | 99精品国产免费久久久久久下载| 国产精品亚洲综合久久| 亚洲精品国精品久久99热| 久久综合九色欧美综合狠狠|