2014-09-04 61 views
0

有上mydesktop parent.lock一個文件,該文件是一個文本文件。我想要鎖定這個文件的PID。所以我設法列出所有使用的手柄。下面列出了代碼。如何獲得文件路徑的手柄被鎖定

我想用CreateFile在我的桌面上打開parent.lock來得到它的句柄,因爲我不知道已經打開的進程我不能使用DuplicateHandle。這可能嗎?

GetFullPathFinal不是我的一對夫婦的原因的選項。一個是它唯一的Vista +。

我列出了所有提手NtQuerySystemInformation(SystemHandleInformation....並返回54000個手柄(沒有這個數字聽起來吧?)

有上mydesktop parent.lock一個文件,該文件是一個文本文件。我想要鎖定這個文件的PID。但我無法弄清楚桌面上的parent.lock文件的文件句柄。

這是我列舉手柄:

Cu.import("resource://gre/modules/ctypes.jsm"); 
var lib_ntdll = ctypes.open("ntdll.dll"); 
var lib_kernel32 = ctypes.open("kernel32.dll"); 

var STATUS_BUFFER_TOO_SMALL = 0xC0000023>>0; 
var STATUS_INFO_LENGTH_MISMATCH = 0xC0000004>>0; 
var SystemHandleInformation = 16; 

var UNICODE_STRING = new ctypes.StructType("UNICODE_STRING", [ 
{'Length': ctypes.unsigned_short}, //USHORT 
{'MaximumLength': ctypes.unsigned_short}, //USHORT 
{'Buffer': ctypes.jschar.ptr} ]); //PWSTR 

//https://github.com/tjguk/winsys/blob/5f11b308171382046ff0f67ef3129e47e9fee06c/random/file_handles.py#L100 
var SYSTEM_HANDLE_TABLE_ENTRY_INFO = new ctypes.StructType('SYSTEM_HANDLE_TABLE_ENTRY_INFO', [ //typedef struct _TagHANDLEINFO 
{'UniqueProcessId': ctypes.unsigned_short}, //USHORT dwPid; //UniqueProcessId 
{'CreatorBackTraceIndex': ctypes.unsigned_short}, //USHORT CreatorBackTraceIndex; //CreatorBackTraceIndex 
{'ObjectTypeIndex': ctypes.unsigned_long}, //BYTE ObjType; //ObjectTypeIndex UCHAR 
{'HandleAttributes': ctypes.unsigned_long}, //BYTE HandleAttributes; //im not sure if byte should be unsigned_long, maybe unsigned_char //HandleAttributes UCHAR 
{'HandleValue': ctypes.unsigned_short}, //USHORT HndlOffset; //HandleValue USHORT 
{'Object': ctypes.void_t.ptr}, //DWORD dwKeObject; //Object PVOID 
{'GrantedAccess': ctypes.unsigned_long} //ULONG GrantedAccess; //GrantedAccess ULONG 
]); //HANDLEINFO, PHANDLEINFO; 


var SYSTEM_HANDLE_INFORMATION = new ctypes.StructType('SYSTEM_HANDLE_INFORMATION', [ 
{'NumberOfHandles': ctypes.unsigned_long}, 
{'Handles': ctypes.ArrayType(SYSTEM_HANDLE_TABLE_ENTRY_INFO, 5)} 
]); 

var NtQuerySystemInformation = lib_ntdll.declare("NtQuerySystemInformation", 
ctypes.winapi_abi, 
ctypes.long, // return //NTSTATUS 
ctypes.int, // SystemInformationClass //SYSTEM_INFORMATION_CLASS 
ctypes.void_t.ptr, // SystemInformation //PVOID 
ctypes.unsigned_long, // SystemInformationLength //ULONG 
ctypes.unsigned_long.ptr); // ReturnLength //PULONG 

/* http://msdn.microsoft.com/en-us/library/ms633499%28v=vs.85%29.aspx 
* HWND WINAPI FindWindow(
* __in_opt LPCTSTR lpClassName, 
* __in_opt LPCTSTR lpWindowName 
*); 
*/ 
// NOT SUPPORTED BY WINXP so just doing this to test and then later will figure out how to get handle to path name then look in here 
var GetFinalPathNameByHandle = lib_kernel32.declare('GetFinalPathNameByHandleW', ctypes.winapi_abi, ctypes.uint32_t, //DWORD 
ctypes.unsigned_short, // HANDLE 
ctypes.void_t.ptr, // LPTSTR 
ctypes.uint32_t, // DWORD 
ctypes.uint32_t // DWORD 
); 



function enumHandles() { 
    var res = {}; 
    var _enumBufSize = new ctypes.unsigned_long(0x4000); 
    var buffer = ctypes.char.array(_enumBufSize.value)(); 

    while (true) { 
     var status = NtQuerySystemInformation(SystemHandleInformation, buffer, 
      _enumBufSize, _enumBufSize.address()); 
     if (status == STATUS_BUFFER_TOO_SMALL || status == STATUS_INFO_LENGTH_MISMATCH) { 
      buffer = ctypes.char.array(_enumBufSize.value)(); 
     } else break; 
    } 

    if (status < 0) return null; 
    var proc = ctypes.cast(buffer.addressOfElement(0), SYSTEM_HANDLE_INFORMATION.ptr).contents; 

    for (var i=0; i<proc.Handles.length; i++) { 
     //console.log('i:', proc.Handles[i].HandleValue); 
     //var nbuff = ctypes.jschar.array()(32); //nbuff.length == 32 
     //var ret = GetFinalPathNameByHandle(proc.Handles[i].HandleValue, nbuff.address(), nbuff.length, 0); 
     //console.log(nbuff.readString()); //always blank i have no idea why 
     if (res[proc.Handles[i].HandleValue]) { 
     res[proc.Handles[i].HandleValue].push(proc.Handles[i]); 
     //console.error('multiple handlevalue occourance for handle value of ', res[proc.Handles[i].HandleValue]) 
     } else { 
     res[proc.Handles[i].HandleValue] = [proc.Handles[i]] 
     } 
    } 
    return res; 
} 

var allHandles = enumHandles(); 
console.log('enumHandles:', Object.keys(allHandles).length, allHandles); 

lib_ntdll.close(); 
lib_kernel32.close(); 

+1

什麼是「處理一個文件路徑」?你的意思是「目錄」?或者「文件句柄」?或者你是否試圖從句柄中檢索文件路徑?我不太清楚你在這裏問什麼。您的號碼是否正確取決於您的特定系統以及當時正在運行的流程;它很容易就是正確的,或者很容易出錯。如果沒有a)您正在使用的代碼,以及b)有關您的系統的詳細信息比我們從這裏獲得的信息要困難得多。任務管理器和進程監視器告訴你什麼? – 2014-09-04 23:55:28

+0

謝謝@KenWhite我添加了代碼和說明。我需要文件處理。到我桌面上的文本文件。 – Blagoh 2014-09-05 00:39:48

+0

@Blagoh:你的編輯根本不回答Ken的問題。 – 2014-09-05 00:40:38

回答

4

NtQuerySystemInformation(SystemHandleInformation, ...)返回SYSTEM_HANDLE_INFORMATION項目,不SYSTEM_HANDLE_TABLE_ENTRY_INFO項的數組。見Enumerating the processes referencing an objectHOWTO: Enumerate handles

如果你已經有了一個開放的HANDLE到一個文件/目錄路徑,如CreateFile(),那麼你應該已經有一個用於打開HANDLE原始路徑。要找到其他的手柄相同的路徑,您可以:

  1. 遍歷數組,尋找其Handle領域的所有條目匹配HANDLE你已經有了,如果你有一個。

  2. 通過陣列循環尋找條目,其ObjectTypeNumber字段是HANDLE_TYPE_FILE。對於每個Handle,使用DuplicateHandle(),使其對您的應用程序的進程空間訪問,然後使用NtQueryInformationFile(..., FileNameInformation)GetFinalPathNameByHandle()來查詢其路徑,然後你就可以比較你正在尋找的路徑(見File handle operations demo)。

+0

謝謝雷米。我再次編輯它。通過54k句柄並在每個句柄上調用GetFinalPathNameByHandle是一個想法,但它太密集。我想讓我們嘗試打開文件,然後以這種方式獲取該文件的句柄,然後在54k句柄中查找該句柄。但該文件被鎖定,所以我很難打開文件來處理它。 – Blagoh 2014-09-05 01:05:02

+0

如果無法以只讀模式打開文件以獲取句柄,則比較路徑字符串是唯一選項。 – 2014-09-05 03:52:21

+0

謝謝雷米。我該如何嘗試以只讀模式打開,這可以是我應該將哪些標誌傳遞給'CreateFile'? – Blagoh 2014-09-05 10:42:39

相關問題