• Visitors can check out the Forum FAQ by clicking this link. You have to register before you can post: click the REGISTER link above to proceed. To start viewing messages, select the forum that you want to visit from the selection below. View our Forum Privacy Policy.
  • Want to receive the latest contracting news and advice straight to your inbox? Sign up to the ContractorUK newsletter here. Every sign up will also be entered into a draw to WIN £100 Amazon vouchers!

Hard .Net api type question

Collapse
X
  •  
  • Filter
  • Time
  • Show
Clear All
new posts

    Hard .Net api type question

    I have a stub driver that received IOCTLS from a C app. I am trying to port this to C#.Net 2008.

    The problem is my IOCTLs are getting mangled so the driver doesn't recognise them.
    I am using the api declaration from pinvoke.net

    Code:
     [DllImport("Kernel32.dll", SetLastError = false, CharSet = CharSet.Auto)] public static extern bool DeviceIoControl( Microsoft.Win32.SafeHandles.SafeFileHandle hDevice, Int32 ioctl, [MarshalAs(UnmanagedType.AsAny)] [In] object InBuffer, int nInBufferSize, [MarshalAs(UnmanagedType.AsAny)] [Out] object OutBuffer, int nOutBufferSize, ref uint pBytesReturned, [In] IntPtr lpOverlapped);
    and my IOCTL is defined as

    Code:
     internal static Int32 SIOCTL_TYPE = 4000; 
    internal static Int32 METHOD_BUFFERED = 0; 
    internal static Int32 FILE_ANY_ACCESS = 0; 
    internal static Int32 IOCTL_START_INBOUND_TRAFFIC =((SIOCTL_TYPE) << 16) |((FILE_ANY_ACCESS) << 14) |((0x900) << 2) | (METHOD_BUFFERED);
    I know from debugview that the driver receives :

    IOCTL code received 262153216

    Somehow I think something is wrong with the marshalling, and possible the API call from PInvoke is wrong. On the off chance any of you guys have tried sending IOCTL from .Net can you suggest what is wrong here?

    (posted on osronline as well)
    Knock first as I might be balancing my chakras.

    #2
    Code:
    internal static Int32 SIOCTL_TYPE = 4000;
    might need to be

    Code:
    internal static Int32 SIOCTL_TYPE = 40000;
    While you're waiting, read the free novel we sent you. It's a Spanish story about a guy named 'Manual.'

    Comment


      #3
      Two (probably totally crap) suggestions

      VS2010 is supposedly far friendly when dealing with unruly dll's and com objects on the fly.

      Or could you keep the actually (communication) driver within a C++ based wrapper and then call that to retrieve the values.
      merely at clientco for the entertainment

      Comment


        #4
        Originally posted by eek View Post
        Or could you keep the actually (communication) driver within a C++ based wrapper and then call that to retrieve the values.
        WHS. When I had to call a complicated COM interface from C#, I gave up trying to make all the "MarhallAs" stuff work and instead created a C++ .NET wrapper DLL and called that from C#. With C++ .NET you can mix and match .NET and native code within the same function, although the syntax is a bit bizarre. Microsoft call this "IJW" for "It Just Works". Easy to be cynical about something like that from Microsoft, but in this case it just does.
        Will work inside IR35. Or for food.

        Comment

        Working...
        X