使用锁定文件上的CreateFile来获取文件句柄
问题描述:
我删除了我的其他问题。感谢所有帮助我实现如何发布。使用锁定文件上的CreateFile来获取文件句柄
我的桌面上有一个名为rawr.txt
的文件。该文件被锁定。我想打开它只是为了获得一个文件句柄。 (我将搜索列举的文件句柄的列表以确定哪些进程ID正在锁定此文件)。
这是我的代码:
Cu.import("resource://gre/modules/ctypes.jsm");
var lib_kernel32 = ctypes.open("kernel32.dll");
//var INVALID_HANDLE_VALUE = ctypes.voidptr_t(-1);
var GENERIC_READ = 0x80000000;
var GENERIC_WRITE = 0x40000000;
var OPEN_EXISTING = 3;
var FILE_ATTRIBUTE_NORMAL = 0x80;
var FILE_FLAG_OVERLAPPED = 0x40000000;
var OPEN_ALWAYS = 4;
var INVALID_HANDLE_VALUE = new ctypes.Int64(-1);
var FSCTL_SET_SPARSE = 0x900c4;
var FSCTL_SET_ZERO_DATA = 0x980c8;
var FILE_BEGIN = 0;
let CreateFile = lib_kernel32.declare(
"CreateFileW",
ctypes.winapi_abi,
ctypes.voidptr_t, // return type: handle to the file
ctypes.jschar.ptr, // in: lpFileName
ctypes.uint32_t, // in: dwDesiredAccess
ctypes.uint32_t, // in: dwShareMode
ctypes.voidptr_t, // in, optional: lpSecurityAttributes (note that
// we're cheating here by not declaring a
// SECURITY_ATTRIBUTES structure -- that's because
// we're going to pass in null anyway)
ctypes.uint32_t, // in: dwCreationDisposition
ctypes.uint32_t, // in: dwFlagsAndAttributes
ctypes.voidptr_t // in, optional: hTemplateFile
);
let CloseHandle = lib_kernel32.declare(
"CloseHandle",
ctypes.winapi_abi,
ctypes.int32_t, //bool // return type: 1 indicates success, 0 failure
ctypes.voidptr_t // in: hObject
);
var aFile = FileUtils.getFile('Desk', ['rawr.txt']);
let filePath = aFile.path;
let hFile = CreateFile(filePath, GENERIC_READ, 0, null, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, null);
let hFileInt = ctypes.cast(hFile, ctypes.intptr_t);
if (ctypes.Int64.compare(hFileInt.value, INVALID_HANDLE_VALUE) == 0) {
throw new Error("CreateFile failed for " + filePath + ", error " +
ctypes.winLastError);
}
CloseHandle(hFile);
lib_kernel32.close();
问题的,这是我总是在throw new Error
行一些例外。我最常使用错误32,有时候使用标志进行测试。
感谢
答
let hFile = CreateFile(filePath, GENERIC_READ, 0, ...)
为dwShareMode参数传递0是不会让你随时随地。这要求对文件进行独占访问,因为另一个进程已经获得了读取或写入访问权限,所以无法获得该文件。通常在日志文件的情况下GENERIC_WRITE访问。你需要FILE_SHARE_READ | FILE_SHARE_WRITE
谦虚地问。
如果这仍然不起作用,那么另一个进程是adamant关于你没有搞乱文件。它故意省略FILE_SHARE_READ。对于文本文件不是很常见,但在程序员认为无法正确读取文件时完成,因为他经常更改它。除了拿起电话和给程序员打电话以外,你不能重写这个决定。
答
由于所有你想要的是文件句柄,你不应该使用GENERIC_READ
。这要求其他进程使用FILE_SHARE_READ
打开文件。
此外,你需要允许其他进程打开了此文件,通过指定FILE_SHARE_READ
,FILE_SHARE_WRITE
和FILE_SHARE_DELETE
:
CreateFile(filepath, 0,
FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE,
...)
...之后这一切,你已经有了一个手柄到无法访问的文件,这是非常无用的。 (您得到的手柄与其他过程的手柄没有任何关系,因此自己手动操作并不能帮助您以任何方式查找现有手柄的列表。)