Comments (7)
Does this look correct?
private static unsafe IAsyncResult BeginDeviceIoControl<TIn, TOut>(HFILE hDevice, uint dwIoControlCode, byte[] buffer, AsyncCallback userCallback, object userState) where TIn : struct where TOut : struct
{
var ar = OverlappedAsync.SetupOverlappedFunction(hDevice, userCallback, buffer);
var prefix = Marshal.SizeOf(typeof(int)) * 2;
var inSz = Marshal.SizeOf(typeof(TIn));
fixed (byte* pIn = &buffer[prefix], pOut = &buffer[prefix + inSz])
{
var ret = DeviceIoControl(hDevice, dwIoControlCode, pIn, (uint)inSz, pOut, (uint)Marshal.SizeOf(typeof(TOut)), out var bRet, ar.Overlapped);
return OverlappedAsync.EvaluateOverlappedFunction(ar, ret);
}
}
from vanara.
it's ok, could you update it to nuget as soon as possible ? thank you.
from vanara.
I'm in the process of testing major changes to the libraries, but expect that testing to take the next 2 weeks. I will release version 2.0 at that time and include this fix.
from vanara.
ok, thanks.
from vanara.
Hey, I find some other troubles:
1.
when calling Task<TOut?> DeviceIoControlAsync<TOut>(SafeFileHandle hDev, uint ioControlCode)
,
it assume input buffer is (int?)
and pass null into :
It will never be zero.
2.
Does this look correct?
private static unsafe IAsyncResult BeginDeviceIoControl<TIn, TOut>(HFILE hDevice, uint dwIoControlCode, byte[] buffer, AsyncCallback userCallback, object userState) where TIn : struct where TOut : struct { var ar = OverlappedAsync.SetupOverlappedFunction(hDevice, userCallback, buffer); var prefix = Marshal.SizeOf(typeof(int)) * 2; var inSz = Marshal.SizeOf(typeof(TIn)); fixed (byte* pIn = &buffer[prefix], pOut = &buffer[prefix + inSz]) { var ret = DeviceIoControl(hDevice, dwIoControlCode, pIn, (uint)inSz, pOut, (uint)Marshal.SizeOf(typeof(TOut)), out var bRet, ar.Overlapped); return OverlappedAsync.EvaluateOverlappedFunction(ar, ret); } }
I had test this code, if I call DeviceIoControlAsync<TIn>(SafeFileHandle hDev, uint ioControlCode, TIn inVal)
,
pOut = &buffer[prefix + inSz]
will cause index out of range exception, because output buffer is null from here:
so prefix + inSz
is equal to buffer.Length
(it should be less than or equal to buffer.Length - 1
)
My solution for both troubles:
private static unsafe IAsyncResult BeginDeviceIoControl(SafeFileHandle hDevice, uint dwIoControlCode, byte[] buffer, AsyncCallback userCallback, object userState) where TIn : struct where TOut : struct { var ar = OverlappedAsync.SetupOverlappedFunction(hDevice, userCallback, buffer); var prefix = Marshal.SizeOf(typeof(int)) * 2; var inSz = BitConverter.ToInt32(buffer, 0); var outSz = BitConverter.ToInt32(buffer, sizeof(int)); fixed (byte* pIn = &buffer[prefix], pOut = &buffer[outSz == 0 ? 0 : prefix + inSz]) { var ret = DeviceIoControl(hDevice, dwIoControlCode, pIn, (uint)inSz, pOut, (uint)outSz, out uint bRet, ar.Overlapped); return OverlappedAsync.EvaluateOverlappedFunction(ar, ret); } }
because outSz
is zero when POut is null, so will not effect origin buffer.
from vanara.
Thank you for all your work on this! I will update the code with your fixes and post it later today.
from vanara.
Fixed in 2.0 release today
from vanara.
Related Issues (20)
- RtlGetVersion not found in NtDll HOT 6
- A great project! HOT 1
- #nullableenabled brunch is not being merged into master HOT 4
- Kernel32.FILE_ID_128.Identifier returns incorrect values
- [Bug] MB_GetString make exe crashed and ExitCode is 3221226356 (0xc0000374) HOT 2
- RobiniaDocs API Explorer HOT 1
- Can not GetLastError HOT 1
- CM_REGISTER_NOTIFICATION callback: Incomplete eventData.u.DeviceInstance.InstanceId HOT 2
- FindNextPrinterChangeNotification SafePRINTER_NOTIFY_INFO is invalid HOT 2
- missing definition for StorageDeviceSeekPenalty. HOT 1
- [Bug] GetRawInputDeviceInfo can not use CharSet = CharSet.Auto HOT 4
- Interface not supported Exception while using the set operaiton in IMAPI HOT 2
- User32.GetWindowLongAuto throws an exception if result is 0 HOT 1
- OverlappedAsyncBaseResult does not make processed bytes available. HOT 1
- How to use native Win32 Shell ImageList in WinUI3 / UWP HOT 7
- Missing unions in FwpUClnt FWPM_* structures HOT 1
- PInvoke.IpHlpApi.GetExtendedUdpTable give wrong port HOT 3
- WTSApi32: Wrong variable used to create dateTime HOT 1
- Wrong Marsha.SizeOf for MODULEENTRY32 HOT 2
- Wrong values in Kernel32.READ_DIRECTORY_NOTIFY_INFORMATION_CLASS enum HOT 1
Recommend Projects
-
React
A declarative, efficient, and flexible JavaScript library for building user interfaces.
-
Vue.js
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
-
Typescript
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
-
TensorFlow
An Open Source Machine Learning Framework for Everyone
-
Django
The Web framework for perfectionists with deadlines.
-
Laravel
A PHP framework for web artisans
-
D3
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
-
Recommend Topics
-
javascript
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
-
web
Some thing interesting about web. New door for the world.
-
server
A server is a program made to process requests and deliver data to clients.
-
Machine learning
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
-
Visualization
Some thing interesting about visualization, use data art
-
Game
Some thing interesting about game, make everyone happy.
Recommend Org
-
Facebook
We are working to build community through open source technology. NB: members must have two-factor auth.
-
Microsoft
Open source projects and samples from Microsoft.
-
Google
Google ❤️ Open Source for everyone.
-
Alibaba
Alibaba Open Source for everyone
-
D3
Data-Driven Documents codes.
-
Tencent
China tencent open source team.
from vanara.