Opening device with CreateFile fails with error code 5 ERROR_ACCESS_DENIED
Hi,
I must confess I don't do this in c++, but since there is no forum for vb.net, I'll try to make it simple (If you disagree on this thread being here please feel free to delete it).
I call function like this:
DeviceHandle = CreateFile _
(DeviceName, _
GENERIC_READ Or GENERIC_WRITE, _
FILE_SHARE_READ Or FILE_SHARE_WRITE, _
Security, _
OPEN_EXISTING, _
0, _
0)
And error I get is 5 ERROR_ACCESS_DENIED. I tried to open file and write to it, and I succeeded but with device it just won't work.
DeviceName: "\\.\HID#Vid_XXXX&Pid_0001#6&2b3c76e7&0&0000#{884b96c3-56ef-11d1-bc8c-00a0c91405dd}"
Security: bInheritHandle -1 Integer
lpSecurityDescriptor 0 Integer
nLength 12 Integer
Even more troubling is that when I try to open device only with GENERIC_WRITE I get the handle (no error).
Opening only with GENERIC_READ also returns error 5.
Anyone had similar experience, or has solution to my problem? Please do post, any help is appreciated.
PS. Maybe Windows opened device for reading and locked it so I can't access it?
Re: Opening device with CreateFile fails with error code 5 ERROR_ACCESS_DENIED
What type of device are you trying to access?
Re: Opening device with CreateFile fails with error code 5 ERROR_ACCESS_DENIED
A DT-Box which purpose is to convert SY-4 to USB (eg. I have a device that returns some values and this box is seen by Windows as Human Interface Device).
Box has one button which sends data taken from device to keyboard.
Device [Data] ----SY-4---->DT-Box-----USB----->Computer
If you need more information please let me know. Hoping for a solution.
Re: Opening device with CreateFile fails with error code 5 ERROR_ACCESS_DENIED
I managed to put it down to this:
I opened device for writing (maybe not good?) like this:
DeviceHandle = CreateFile _
(DeviceName, _
GENERIC_WRITE, _
FILE_SHARE_READ Or FILE_SHARE_WRITE, _
Security, _
OPEN_EXISTING, _
0, _
0)
And all I need to do is send it some information (2 bytes) like this:
Success = WriteFile _
(DeviceHandle, _
OutFeatureReportBuffer(0), _
2, _
NumberOfBytesWritten, _
0)
Success = False (and NumberOfBytesWritten = 0) so I try:
Marshal.GetLastWin32Error()
and get error 1 = ERROR_INVALID_FUNCTION (Incorrect function.)
Definition of WriteFile:
<DllImport("kernel32.dll", setlasterror:=True)> Private Shared Function WriteFile _
(ByVal hFile As Integer, _
ByRef lpBuffer As Byte, _
ByVal nNumberOfBytesToWrite As Integer, _
ByRef lpNumberOfBytesWritten As Integer, _
ByVal lpOverlapped As Integer) _
As Boolean
End Function
Any ideas this is giving me a headache.
Re: Opening device with CreateFile fails with error code 5 ERROR_ACCESS_DENIED
Well, if you only need to write (to send 2 bytes) to this device then why did you try to pass GENERIC_READ flag?
Besides, try to use DeviceIoControl rather than WriteFile.
Re: Opening device with CreateFile fails with error code 5 ERROR_ACCESS_DENIED
>> OutFeatureReportBuffer(0), _
Shouldn't a feature report be set via HidD_SetFeature?
>> try to use DeviceIoControl
Or IOCTL_HID_SET_FEATURE :)
gg
Re: Opening device with CreateFile fails with error code 5 ERROR_ACCESS_DENIED
Quote:
Originally Posted by
VictorN
Well, if you only need to write (to send 2 bytes) to this device then why did you try to pass GENERIC_READ flag?
Besides, try to use DeviceIoControl rather than WriteFile.
DeviceIoControl also returns error code 5 ACCESS_DENIED. :(
Quote:
Originally Posted by
Codeplug
Yeah it is, i was trying that function and then tried WriteFile and decided I need WriteFile and forgot to change the name of buffer, but that doesn't make any difference.
From the beginning, I try to simulate button press on HID. How to do that? WriteFile and DeviceIoControl are good way? If so I can't use them because of error access denied. Any other function or easier way to do that? Can it be done with DirectX? Thanks for help anyway.
Re: Opening device with CreateFile fails with error code 5 ERROR_ACCESS_DENIED
I understand this is jumping from subject to subject (WinAPI -> DirectX), but I am trying to solve above mentioned problem:
Quote:
I try to simulate button press on HID. How to do that?
Any solution is acceptable :)
So I tried DirectX function to detect devices:
Microsoft.DirectX.DirectInput.Manager.GetDevices(DeviceClass.All, EnumDevicesFlags.AllDevices)
I only got my keyboard and mouse :(
So, i tried using guid (since when I discover my device and get it's "name" it contains guid):
deviceGuid = "{884b96c3-56ef-11d1-bc8c-00a0c91405dd}"
Dim devguid As System.Guid = New System.Guid(deviceGuid)
Dim gamepadDevice As Device = New Device(devguid)
Now when second line of code is executed i get:
- devguid {System.Guid} System.Guid
Empty Nothing System.Guid
This means devguid isn't initialized properly??
And, as I assumed, third line returns exception:
Microsoft.DirectX.DirectInput.DeviceNotRegisteredException (Message: {"Error in the application."})
Any ideas on Simulating a key press on non-standard (eg. not joystick) HID?
Re: Opening device with CreateFile fails with error code 5 ERROR_ACCESS_DENIED
>> Any ideas on Simulating a key press on non-standard (eg. not joystick) HID?
So you want the OS (and some application) to think a HID report is coming from the actual device? I don't think you can do that by simply writing to the device [driver] (unless the device [driver] explicitly echos back what's written to it).
You could create your own HID driver that sends up your own HID reports, but if the software that is reading those reports is looking for a specific device (product/vendor ID) then that may not work either. http://www.microsoft.com/whdc/devtools/DSF.mspx
gg
Re: Opening device with CreateFile fails with error code 5 ERROR_ACCESS_DENIED
Quote:
Originally Posted by
Codeplug
>>
Any ideas on Simulating a key press on non-standard (eg. not joystick) HID?
So you want the OS (and some application) to think a HID report is coming from the actual device? I don't think you can do that by simply writing to the device [driver] (unless the device [driver] explicitly echos back what's written to it).
You could create your own HID driver that sends up your own HID reports, but if the software that is reading those reports is looking for a specific device (product/vendor ID) then that may not work either.
http://www.microsoft.com/whdc/devtools/DSF.mspx
gg
Yes it has specific vid and pid (and i know them). But, device puts data on "keyboard" eg. it does keypresses of data, so I detect them with GetAsyncKeyState (and that works and it isn't problem), so only thing i need now is to press that button :)
Re: Opening device with CreateFile fails with error code 5 ERROR_ACCESS_DENIED
Well, you can use SenInput() to simulate keystrokes - http://msdn.microsoft.com/en-us/libr...8VS.85%29.aspx
gg
Re: Opening device with CreateFile fails with error code 5 ERROR_ACCESS_DENIED
Quote:
Originally Posted by
Codeplug
But, it is non-standard device eg. not recognized as keyboard or mouse. Confusing, but true.