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)
- Wrong values in Kernel32.READ_DIRECTORY_NOTIFY_INFORMATION_CLASS enum HOT 1
- SearchApi.IQuerySolution.Resolve() should not require unsafe pointer for parameter "SYSTEMTIME* pstReferenceTime" HOT 7
- Wrong layout of Shell32.STRRET structure in x64 process HOT 1
- False-positive `IsNullOrEmpty` on `StrPtrAuto` HOT 1
- Wrong marshalling for pszVerb in Shell32.IFolderView2.InvokeVerbOnSelection() HOT 1
- The file generated by ShellLink.Create() is not a shortcut file. HOT 1
- Dotnet 5 Error HOT 7
- SafeHANDLE != operator should make parameters nullable HOT 3
- WinINet.InternetSetOption seems breaking change in 4.0.0 HOT 1
- CRYPT_PROVIDER_DATA duplicates CRYPT_PROVUI_DATA HOT 1
- System.TypeInitializationException: The type initializer for '<Module>' threw an exception. HOT 1
- DOSvc unit test fails with 0x80010123 HOT 2
- Unable to create TXT records HOT 3
- ErrorHelper.GetErrorMessage throws System.OverflowException HOT 1
- ContextMenu related problems HOT 1
- Add a function to enumerate all open Windows Explorer Instances, including the path that is selected
- Problems using WlanGetNetworkBssList of the WLAN API HOT 3
- Custom marshalers cannot be used on fields of structures. HOT 1
- IpHlpApi.GetAdaptersAddresses() GatewayAddresses Member is always zero HOT 3
- The Portable Device API uses HRESULT return values for their methods HOT 3
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.