GetQueuedCompletionStatus阻塞文件打开c#

时间:2015-05-01 05:58:14

标签: c# c service driver minifilter

我正在尝试将驱动程序客户端从c转换为c#。我能够完全在c中工作,但是当我在c#中转换它时,阻止文件打开代码供你参考,如下所示:

       [DllImport("fltLib.dll", CallingConvention = CallingConvention.Winapi, CharSet = CharSet.Auto, SetLastError = true)]  
        public static extern unsafe int FilterGetMessage(  
            IntPtr hPort,  
            IntPtr lpMessageBuffer,  
            int dwMessageBufferSize,  
            void* Overlapped  
            );  
    IntPtr buf = Marshal.AllocHGlobal(
         Marshal.SizeOf(msg.MessageHeader));
        OVERLAPPED povlp;
         Marshal.StructureToPtr(msg.MessageHeader, buf, false);
         var sizeUserRec = Marshal.SizeOf(typeof(OVERLAPPED));
         var userRec = Marshal.AllocHGlobal(sizeUserRec);
         povlp.Internal = UIntPtr.Zero;
         povlp.InternalHigh = UIntPtr.Zero;
         povlp.Offset = 0;
         povlp.OffsetHigh = 0;
         povlp.Pointer = IntPtr.Zero;
         povlp.hEvent = IntPtr.Zero;
         headerSize = Marshal.SizeOf(msg.MessageHeader);

             msgsize += headerSize;
 unsafe
             {
                 status = FilterGetMessage(
                                        portPtr,
                                        buf,
                                        msgsize,
                                        &povlp
                                        ); 
             }

[DllImport("kernel32.dll")] static extern bool GetQueuedCompletionStatus(IntPtr CompletionPort, ref uint lpNumberOfBytes, ref IntPtr lpCompletionKey, ref IntPtr lpOverlapped, uint dwMilliseconds);

 static _OVERLAPPED Ovlp;  

 Console.WriteLine("int sddc");
        _SCANNER_NOTIFICATION notification;
        _SCANNER_REPLY_MESSAGE replyMessage;        
        IntPtr pOvlp;
        pOvlp = Marshal.AllocHGlobal(Marshal.SizeOf(Ovlp));
        Marshal.StructureToPtr(Ovlp, pOvlp, false);
        _SCANNER_MESSAGE message;                
         bool result;
         uint outSize = 3435973836, milisec = 0xFFFFFFFF;
         int hr;
         IntPtr key =  IntPtr.Zero;             
         result = GetQueuedCompletionStatus(Context.Completion, ref outSize, ref key, ref pOvlp,uint.MaxValue); //error line
         if (!result)
         {
             Console.WriteLine("Not valid");
         }

0 个答案:

没有答案
相关问题