繁体   English   中英

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

[英]NullReferenceException when setting a out parameter in c#

我在 c# 中使用 easyhook 得到了一个不安全的程序集.. 这段代码波纹管运行良好,但总而言之,调用此方法时出现 NullReferenceException ..

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

此类用于拦截某些 I/O 文件中的所有写入以进行某些操作

任何想法见代码..

仅在执行 SQLCOMMAND 时发生

在 ....SystemHook.WriteFileHook(IntPtr hFile, Void* lpBuffer, UInt32 nNumberOfBytesToWrite, UInt32& lpNumberOfBytesWritten, NativeOverlapped& lpOverlapped)
在 SNIWriteSyncOverAsync(SNI_ConnWrapper* , SNI_Packet* )
在 SNINativeMethodWrapper.SNIWritePacket(SafeHandle pConn, SafeHandle packet, Boolean sync)
在 System.Data.SqlClient.TdsParserStateObject.SNIWritePacket(SNIHandle 句柄,SNIPacket 数据包,UInt32& sniError,Boolean canAccumulate,Boolean callerHasConnectionLock)
在 System.Data.SqlClient.TdsParserStateObject.WriteSni(Boolean canAccumulate)
在 System.Data.SqlClient.TdsParserStateObject.WritePacket(Byte flushMode, Boolean canAccumulate)
在 System.Data.SqlClient.TdsParserStateObject.ExecuteFlush()
在 System.Data.SqlClient.TdsParser.TdsExecuteSQLBatch(String text, Int32 timeout, SqlNotificationRequest notificationRequest, TdsParserStateObject stateObj, Boolean sync, Boolean callerHasConnectionLock, Byte[] enclavePackage)
在 System.Data.SqlClient.SqlCommand.RunExecuteReaderTds(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, Boolean async, Int32 timeout, Task& task, Boolean asyncWrite, Boolean inRetry, SqlDataReader ds, Boolean describeParameterEncryptionRequest)
在 System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, String 方法, TaskCompletionSource`1 完成, Int32 超时, Task& 任务, Boolean&usedCache, Boolean asyncWrite, Boolean inRetry)
在 System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, String method)
在 System.Data.SqlClient.SqlCommand.ExecuteReader(CommandBehavior 行为,String 方法)
在 System.Data.SqlClient.SqlCommand.ExecuteDbDataReader(CommandBehavior 行为)
在 System.Data.Common.DbCommand.ExecuteReader()

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!!!

    ... 
}

贾斯汀斯坦宁他的评论中是正确的:

尝试使用 uint* 或 ref uint 来正确匹配本地签名 LPDWORD。

我有错误的签名。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM