Windows CreateFile в C# возвращает недопустимый дескриптор

Я пытаюсь вызвать метод CreateFile из Kernel32.dll в приложении C#, и он каждый раз возвращает недопустимый дескриптор. Я просмотрел все и не могу найти решение этой проблемы. Вот соответствующий код:

Константы:

    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;
    }

Может ли кто-нибудь помочь мне разобраться в проблеме?


person Luke    schedule 18.08.2011    source источник


Ответы (2)


Ваше объявление неверно, второй аргумент - это uint, а не ulong. Веб-сайт pinvoke.net является достойным источником объявлений. Обязательно сгенерируйте Win32Exception, если JFifoDrv.IsInvalid имеет значение true.

person Hans Passant    schedule 18.08.2011
comment
В этом была проблема. Большое спасибо. Меня сбил с толку тот факт, что объявления констант были длинными. - person Luke; 18.08.2011

Я почти уверен, что "\\\\.\\JFIFODRV" — это недопустимое имя устройства и уж точно недопустимое имя файла. Что-то вроде "\\\\.\\F:" должно открыть диск / раздел F:, хотя я почти уверен, что это не удастся, если F: смонтирован, поскольку вы запрашиваете доступ для записи.

Что вы пытаетесь открыть?

Также вам следует вызвать Marshal.GetLastWin32Error - это приведет к более подробному коду ошибки, чем просто «это не сработало».

person Justin    schedule 18.08.2011
comment
Я получил имя файла от парня, который написал оригинальную версию этой программы. Я переделываю все это на С#, и мне нужно загрузить этот драйвер. Это драйвер, который выдает данные о производительности. - person Luke; 18.08.2011