2014-09-05 47 views
1

我删除了我的其他问题。感谢所有帮助我实现如何发布。使用锁定文件上的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,有时候使用标志进行测试。

感谢

回答

1
let hFile = CreateFile(filePath, GENERIC_READ, 0, ...) 

为dwShareMode参数传递0是不会让你随时随地。这要求对文件进行独占访问,因为另一个进程已经获得了读取或写入访问权限,所以无法获得该文件。通常在日志文件的情况下GENERIC_WRITE访问。你需要FILE_SHARE_READ | FILE_SHARE_WRITE谦虚地问。

如果这仍然不起作用,那么另一个进程是adamant关于你没有搞乱文件。它故意省略FILE_SHARE_READ。对于文本文件不是很常见,但在程序员认为无法正确读取文件时完成,因为他经常更改它。除了拿起电话和给程序员打电话以外,你不能重写这个决定。

2

由于所有你想要的是文件句柄,你不应该使用GENERIC_READ。这要求其他进程使用FILE_SHARE_READ打开文件。

此外,需要允许其他进程打开了此文件,通过指定FILE_SHARE_READFILE_SHARE_WRITEFILE_SHARE_DELETE

CreateFile(filepath, 0, 
      FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE, 
      ...) 

...之后这一切,你已经有了一个手柄到无法访问的文件,这是非常无用的。 (您得到的手柄与其他过程的手柄没有任何关系,因此自己手动操作并不能帮助您以任何方式查找现有手柄的列表。)

相关问题