在c#

时间:2019-01-12 14:38:19

标签: c# nullreferenceexception unsafe easyhook

我在C#中使用easyhook获得了一个不安全的程序集。此代码波纹管运行良好 但是总的来说,调用此方法时出现了NullReferenceException。

此类的实例是Singleton模式 它经过了几次,有一点得到了空引用

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

任何想法 查看代码。

仅在执行SQLCOMMAND时出现

  

at .... SystemHook.WriteFileHook(IntPtr hFile,Void * lpBuffer,UInt32   nNumberOfBytesToWrite,UInt32&lpNumberOfBytesWritten,   NativeOverlapped和lpOverlapped)
在   SNIWriteSyncOverAsync(SNI_ConnWrapper *,SNI_Packet *)
在   SNINativeMethodWrapper.SNIWritePacket(SafeHandle pConn,SafeHandle   数据包,布尔同步)
在   System.Data.SqlClient.TdsParserStateObject.SNIWritePacket(SNIHandle   句柄,SNIPacket数据包,UInt32&sniError,布尔值canAccumulate,   布尔值调用者HasConnectionLock)
在   System.Data.SqlClient.TdsParserStateObject.WriteSni(布尔   canAccumulate)
在   System.Data.SqlClient.TdsParserStateObject.WritePacket(字节flushMode,   布尔值canAccumulate)
在   System.Data.SqlClient.TdsParserStateObject.ExecuteFlush()
位于   System.Data.SqlClient.TdsParser.TdsExecuteSQLBatch(字符串文本,Int32   超时,SqlNotificationRequest notificationRequest,   TdsParserStateObject stateObj,布尔同步,布尔   callerHasConnectionLock,Byte [] enclavePackage)
在   System.Data.SqlClient.SqlCommand.RunExecuteReaderTds(CommandBehavior   cmdBehavior,RunBehavior,runBehavior,布尔returnStream,布尔   异步,Int32超时,任务和任务,布尔asyncWrite,布尔inRetry,   SqlDataReader ds,布尔值describeParameterEncryptionRequest)
在   System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior   cmdBehavior,RunBehavior,runBehavior,布尔值returnStream,字符串   方法,TaskCompletionSource`1完成,Int32超时,任务和任务,   布尔值和usedCache,布尔值asyncWrite,布尔值inRetry)
at   System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior   cmdBehavior,RunBehavior,runBehavior,布尔值returnStream,字符串   方法)
  System.Data.SqlClient.SqlCommand.ExecuteReader(CommandBehavior   行为,字符串方法)
在   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!!!

    ... 
}

1 个答案:

答案 0 :(得分:0)

Justin Stenninghis comment中是正确的:

  

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

我签名错误。