• <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 閱讀(6539) 評論(0)  編輯 收藏 引用
            漂亮人妻被黑人久久精品| 久久se这里只有精品| 久久亚洲春色中文字幕久久久| 久久综合给久久狠狠97色| avtt天堂网久久精品| 久久久久久久综合综合狠狠| 一本久久a久久精品vr综合| 久久精品嫩草影院| 三级三级久久三级久久| 麻豆精品久久精品色综合| 2020久久精品亚洲热综合一本| 国产成人久久AV免费| 久久香综合精品久久伊人| 韩国三级中文字幕hd久久精品| 久久久久久国产精品无码超碰| 久久久不卡国产精品一区二区| 国产精品久久久久天天影视| 噜噜噜色噜噜噜久久| 久久久久久亚洲精品不卡| 国产高潮国产高潮久久久91 | 97热久久免费频精品99| 久久中文字幕精品| 日韩久久无码免费毛片软件| 99久久国产免费福利| 波多野结衣中文字幕久久| 色欲久久久天天天综合网| 久久久噜噜噜久久中文字幕色伊伊| 国内精品久久久久影院网站| 久久亚洲精品视频| 久久国产精品久久精品国产| 国产成人无码久久久精品一| 亚洲中文精品久久久久久不卡| 亚洲精品午夜国产va久久| 亚洲国产成人久久综合野外| 一本久久综合亚洲鲁鲁五月天亚洲欧美一区二区 | 欧美亚洲国产精品久久蜜芽| 久久精品国产久精国产| 青青草国产成人久久91网| 99热成人精品免费久久| 国内精品免费久久影院| 四虎影视久久久免费观看|