텍스트 파일 인 mydesktop parent.lock
에 파일이 있습니다. 이 파일을 잠그고있는 PID를 원합니다. 그래서 나는 사용중인 모든 핸들을 나열 할 수있었습니다. 아래 코드가 치솟았습니다.잠긴 파일 경로의 핸들을 얻는 방법
은 내가이 열려 내가 DuplicateHandle
를 사용할 수있는 방법을 알고하지 않는 한, 그 핸들을 얻기 위해 내 바탕 화면에 parent.lock
을 열 CreateFile
를 사용하고 싶습니다. 이것이 가능한가?
GetFullPathFinal
몇 가지 이유로 나를위한 옵션이 아닙니다. 하나는 유일한 비스타 +.
나는 NtQuerySystemInformation(SystemHandleInformation....
모든 핸들을 나열하며 (이 번호를 잘 들린다?)
하는 텍스트 파일입니다 mydesktop을 parent.lock
에있는 파일이 있습니다 54000 개 핸들을 돌려 보냈다. 이 파일을 잠그고있는 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();
"파일 경로의 핸들"이란 무엇입니까? "디렉토리"를 의미합니까? 아니면 "파일 핸들"입니까? 또는 핸들에서 파일 경로를 검색하려고합니까? 네가 여기서 묻고 있는게 뭔지 잘 모르겠다. 귀하의 번호가 올바른지 아닌지는 귀하의 특정 시스템과 그 당시에 어떤 프로세스가 실행되고 있는지에 달려 있습니다. 쉽게 옳을 수도 있고 쉽게 잘못 될 수도 있습니다. a) 사용중인 코드없이 b) 시스템에 대한 자세한 정보를 여기에서 액세스 할 수있는 것보다 많이 전달하는 것은 어렵습니다. 작업 관리자와 프로세스 모니터는 귀하에게 무엇을 말합니까? –
감사합니다. @KenWhite 코드 및 설명을 추가했습니다. 제발 손잡이가 필요해. 바탕 화면의 텍스트 파일로. – Blagoh
@Blagoh : 귀하의 편집은 Ken의 질문에 전혀 대답하지 않습니다. –