獲取檔案物件的名稱

2021-08-24 19:10:44 字數 1744 閱讀 4525

獲取檔案物件的名稱

一.取檔案物件名稱

我們可以使用函式obquerynamestring 來查詢獲取檔案物件(file_object )的名稱。由於檔案物件有專門的名稱查詢函式iopqueryname ,所以obquerynamestring 在內部會直接呼叫這個函式來查詢檔案物件名。

我們還有另外一種方法比較「直接」地獲得檔案物件名稱。我們知道:檔案物件名包括驅動器名和檔案路徑名。

file_object 結構中有乙個成員filename ,它只包括檔案路徑名(注意:不包括驅動器名)。

file_object 結構中另外有乙個成員deviceobject ,它是指向device_object 的裝置物件。該裝置就是包含該檔案的驅動器裝置物件。我們可以呼叫obquerynamestring 查詢獲取此裝置物件的名稱。但是裝置名稱的格式是這樣的://device//harddiskvolumex

(x 為數字),並不是常見的c/d/e... 驅動器名格式。這是因為我們說的驅動器名其實是上面這些裝置物件的符號鏈結(symbolic link) 名,我們可以通過iovolumedevicetodosname (在xp/2003 等下使用,在nt/2000 下使用rtlvolumedevicetodosname )來將裝置名稱轉成驅動器名。

但是若直接使用obquerynamestring 查詢檔案物件的話,返回的名稱就是裝置名稱和文路徑名,如:/device/harddiskvolume1/windows/system32/smss.exe

此時我們是沒有裝置物件,所以就沒有辦法呼叫iovolumedevicetodosname 來轉化了,此時該怎麼辦?有乙個比較笨的方法,就是呼叫zwopensymbolclink 物件對所有a~z 字母進行開啟鏈結物件,並呼叫zwquerysymbiliclink 來獲得對應的裝置物件名,並將這個裝置名與上面的obqueynamestring 返回的裝置名進行比較,以此來確定驅動器名。見下面的**片段:

… rtlinitunicodestring(&symboliclink, l"//??//c:");

linktarget.maximumlength = 200;

linktarget.buffer = exallocatepoolwithtag(nonpagedpool, 200, 'test');

for (c = 'a'; c <='z'; c++) }

exfreepoolwithtag(linktarget.buffer, 'test'); …

二.引申:獲取程序的主程式名

首先說一下每個程序的映像名稱,這不是程序物件名。在_eprocess 結構中有乙個imagefilename 得成員(在xpsp3 下偏移為174h ), 它是乙個16 個位元組的陣列,它就是程序的映像名稱,當有名稱超過15 位是就擷取前15 個位元組,最後乙個位元組為null 。

當需要知道程序的主程式名時,我們通過下面的關係獲得該程序對應的檔案物件 : eprocess->

sectionobject

->segment->controlarea->filepointer

,只有一點要注意: sectionobject

的 segment

結構為 _segment

,而不是 _segment_object

,這個常常搞錯。

例如:下例就是返回程序物件對應的檔案物件的過程:

void ntapi getfilepointer(pulong processobject, pulong *fileobject)

如何獲取C 物件的名稱

最近在寫乙個有關活 的演算法,需要通過活 中的乙個節點,得出活 的所有開始節點。為了驗證演算法的正確性,想要在遍歷到每個節點時把節點的物件輸出來,當然可以為節點物件設定乙個成員,在構造的時候不同的物件傳入不同的值,比如 nodeclass node1 node1 可是覺得每次要把那個名字再敲一遍,有...

獲取產生跟蹤檔案的名稱(指令碼)

當我們使用sql trace 10046等事件進行程序跟蹤時,會生成跟蹤檔案.跟蹤檔名稱由以下幾部分組成 ora trc 以下指令碼使用者獲得跟蹤檔名稱 for unix sqlplus as sysdba sql plus release 9.2.0.4.0 production on fri o...

python獲取父程序名稱 獲取程序的名稱

對程序的名稱獲取的幾種方法 import time import multiprocessing import os def work1 for i in range 10 print 我是work i,multiprocessing.current process pid ppid獲取父程序的編號...