C# 在c中设置out参数时出现NullReferenceException#

C# 在c中设置out参数时出现NullReferenceException#,c#,nullreferenceexception,unsafe,easyhook,C#,Nullreferenceexception,Unsafe,Easyhook,我在c#中使用easyhook得到了一个不安全的程序集。。该代码运行良好 但是,当调用此方法时,我得到了一个NullReferenceException 这个类的实例是一个单例模式 它经过了好几次,有一次它得到了一个空引用 该类用于拦截某些I/O文件中的所有写入以继续某些操作 有什么想法吗 参见代码 仅在执行SQLCOMMAND时发生 在…SystemHook.WriteFileHook(IntPtr hFile,Void*lpBuffer,UInt32 n写入的字节数、UInt32和lpnum

我在c#中使用easyhook得到了一个不安全的程序集。。该代码运行良好 但是,当调用此方法时,我得到了一个NullReferenceException

这个类的实例是一个单例模式 它经过了好几次,有一次它得到了一个空引用

该类用于拦截某些I/O文件中的所有写入以继续某些操作

有什么想法吗 参见代码

仅在执行SQLCOMMAND时发生

在…SystemHook.WriteFileHook(IntPtr hFile,Void*lpBuffer,UInt32 n写入的字节数、UInt32和lpnumberofbytes, 本地重叠和lpOverlapped)
SNIWriteSyncOverAsync(SNI_ConnWrapper*,SNI_Packet*)
SNINativeMethodWrapper.sniWritePackage(安全手柄pConn,安全手柄 数据包,布尔同步)
System.Data.SqlClient.TdsParserStateObject.SNIWritePacket(SNIHandle 句柄,SNIPack数据包,UInt32和SNIRERROR,布尔值可累加, 布尔调用方(连接锁)
位于 System.Data.SqlClient.TdsParserStateObject.WriteSni(布尔值 可累积)
System.Data.SqlClient.TdsParserStateObject.WritePacket(字节刷新模式, 布尔值(可累加)
System.Data.SqlClient.TdsParserStateObject.ExecuteFlush()
位于 System.Data.SqlClient.TdsParser.TdsExecuteSQLBatch(字符串文本,Int32 超时,SqlNotificationRequest notificationRequest, TdsParserStateObject stateObj,布尔同步,布尔 调用方连接锁,字节[]enclavePackage)
位于 System.Data.SqlClient.SqlCommand.RunExecuteReaderTds(CommandBehavior cmdBehavior、RunBehavior、Boolean returnStream、Boolean 异步、Int32超时、任务和任务、布尔异步写入、布尔inRetry、, SqlDataReader ds,布尔描述参数加密请求)
System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior、RunBehavior、布尔返回流、字符串 方法,TaskCompletionSource`1完成,Int32超时,任务和任务, Boolean&usedCache,Boolean异步写入,Boolean inrray)
at System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior、RunBehavior、布尔返回流、字符串 方法)
在 System.Data.SqlClient.SqlCommand.ExecuteReader(CommandBehavior 行为,字符串方法)
System.Data.SqlClient.SqlCommand.ExecuteDbDataReader(CommandBehavior 行为)
位于System.Data.Common.DbCommand.ExecuteReader()

在以下方面是正确的:

请尝试uint*或ref uint,以正确匹配本机签名LPDWORD


我的签名有误。

是否更改为uint?问号将允许为空。那么LPNumberOfBytesWrited=LPNumberOfBytesWrited==null?空:0;此标量分配不能导致(托管)NullReferenceException。发布完整的异常详细信息,包括调用堆栈。这里有不安全代码,这意味着所有常用的安全系统都已关闭。您应该很高兴,当它被错误地调用时会崩溃,而不是破坏用户数据或CLR数据结构;这意味着你至少可以找到问题所在。首先仔细查看调用堆栈。其他信息,看起来只有在执行sql命令时才会发生。现在这可能会变得有趣。我猜sql命令的执行会触发钩子,因为您是通过命名管道连接到sql Server的?现在您发布了调用堆栈,但仍然缺少异常详细信息。钩子处理程序的完整代码?哪一行?
bool WriteFileHook(IntPtr hFile, void* lpBuffer, uint nNumberOfBytesToWrite, out uint lpNumberOfBytesWritten, [In] ref System.Threading.NativeOverlapped lpOverlapped)
{

    bool results = false;
    bool write = true;

    lpNumberOfBytesWritten = 0; // CRASH!!!

    ... 
}