C#中的Windows CreateFile返回无效句柄

时间:2011-08-18 16:06:16

标签: c# createfile kernel32

我试图在C#应用程序中从Kernel32.dll调用CreateFile方法,并且每次都返回一个无效的句柄。我看了一遍,无法找到解决这个问题的方法。以下是相关代码:

常量:

    const UInt64 GENERIC_READ = 0x80000000L;
    const UInt64 GENERIC_WRITE = 0x40000000L;
    const UInt64 GENERIC_EXECUTE = 0x20000000L;
    const UInt64 GENERIC_ALL = 0x10000000L;
    const uint FILE_SHARE_READ = 0x00000001; 
    const uint FILE_SHARE_WRITE = 0x00000002;
    const uint OPEN_EXISTING = 0x00000003;
    const uint FILE_FLAG_DELETE_ON_CLOSE = 0x04000000;

导入方法:

[DllImport("kernel32.dll", SetLastError = true)]
    static extern unsafe SafeFileHandle CreateFile(
          string FileName,                   
          ulong DesiredAccess,                
          uint ShareMode,                    
          IntPtr SecurityAttributes,            
          uint CreationDisposition,           
          uint FlagsAndAttributes,            
          IntPtr hTemplateFile                   
          );
SafeFileHandle JFifoDrv = LoadDriver();

加载驱动程序的方法:

unsafe private SafeFileHandle LoadDriver()
    {
        SafeFileHandle hDrv = (SafeFileHandle)null;
        try
        {
            hDrv = CreateFile("\\\\.\\JFIFODRV",
                GENERIC_READ | GENERIC_WRITE,
                FILE_SHARE_READ | FILE_SHARE_WRITE,
                (IntPtr)null,
                OPEN_EXISTING,
                FILE_FLAG_DELETE_ON_CLOSE,
                (IntPtr)null);

            DriverLoaded = true;
        }
        catch
        {
            poll.Stop();
            DriverLoaded = false;
        }

        return hDrv;
    }

任何人都可以帮我解决问题吗?

2 个答案:

答案 0 :(得分:3)

您的声明是错误的,第二个参数是uint,而不是ulong。 pinvoke.net网站是一个很好的声明来源。当JFifoDrv.IsInvalid为true时,请务必抛出Win32Exception。

答案 1 :(得分:0)

我很确定"\\\\.\\JFIFODRV"是一个无效的设备名称,它肯定不是有效的文件名。像"\\\\.\\F:"之类的东西应该打开F:驱动器/分区,虽然我很确定如果安装了F:这会失败,因为你要求写访问权。

你打算打开什么?

此外,您应该致电Marshal.GetLastWin32Error - 这将获得更多详细信息的错误代码,而不仅仅是“它不起作用”。