HID Scanner - CreateFile дает доступ запрещен - PullRequest
0 голосов
/ 14 июня 2019

Используя приведенный ниже код, я получаю ошибку 5 (доступ запрещен) при попытке использовать CreateFile для чтения моего сканера (который является устройством HID). В этом посте кто-то предлагает, чтобы клавиатуры открывались в эксклюзивном режиме, и это невозможно.Я видел другие сообщения людей, говорящих, что у них нет таких проблем.

Должно ли это быть возможным?Что-то не так с параметрами?

Для downvoters, не могли бы вы сказать мне, что не так, по вашему мнению, как я новичок в этом.

Ps.У меня был некоторый успех при перехвате необработанных данных с использованием User32.dll и методов GetRawxxx, но это не долгосрочное решение.

public class Hid
{
    public const uint FILE_SHARE_READ = 0x00000001;
    public const uint FILE_SHARE_WRITE = 0x00000002;
    public const int OPEN_EXISTING = 3;
    public const uint GENERIC_READ = 0x80000000;
    public const uint GENERIC_WRITE = 0x40000000;

    string DeviceId = "...";

    private SafeFileHandle _ReadSafeFileHandle;
    private FileStream _ReadFileStream;
    private const int ReadBufferSize = 65;

    public async Task<string> Read()
    {
        _ReadSafeFileHandle = CreateFile(DeviceId, GENERIC_READ, FILE_SHARE_READ, IntPtr.Zero, OPEN_EXISTING, 0, IntPtr.Zero);

        if (_ReadSafeFileHandle.IsInvalid) 
            return "Invalid handle " + Marshal.GetLastWin32Error();

        _ReadFileStream = new FileStream(_ReadSafeFileHandle, FileAccess.ReadWrite, ReadBufferSize, false);
        var bytes = new byte[ReadBufferSize];
        await _ReadFileStream.ReadAsync(bytes, 0, bytes.Length);

        return System.Text.ASCIIEncoding.ASCII.GetString(bytes);
    }

    [DllImport("kernel32.dll", SetLastError = true, CharSet = CharSet.Unicode)]
    public static extern SafeFileHandle CreateFile(string lpFileName, uint dwDesiredAccess, uint dwShareMode, IntPtr lpSecurityAttributes, uint dwCreationDisposition, uint dwFlagsAndAttributes, IntPtr hTemplateFile);
}

Обновление:

Попытка изменить на ...

        _CreateFile(DeviceId, 0, FILE_SHARE_READ | FILE_SHARE_WRITE, IntPtr.Zero, OPEN_EXISTING, 0, IntPtr.Zero);

Я получил правильный дескриптор файла, но вызов ReadFile просто возвращает пустой буфер.Попытка создать FileStream дает «Доступ к пути запрещен».

...