NullReferenceException при установке выходного параметра в c # - PullRequest
0 голосов
/ 12 января 2019

Я получил небезопасную сборку с помощью easyhook в c # .. этот код работает хорошо но сумма времени, я получил NullReferenceException, когда этот метод вызывается ..

Экземпляр этого класса - шаблон Singleton Прошло несколько раз, и одна точка получила нулевую ссылку

Этот класс, если для перехвата любой записи в некоторый файл ввода / вывода выполнить какую-либо операцию

Любые идеи Смотрите код ..

происходит только при выполнении SQLCOMMAND

at .... SystemHook.WriteFileHook (IntPtr hFile, Void * lpBuffer, UInt32 nNumberOfBytesToWrite, UInt32 & lpNumberOfBytesWritten, NativeOverlapped & lpOverlapped)
в SNIWriteSyncOverAsync (SNI_ConnWrapper *, SNI_Packet *)
в SNINativeMethodWrapper.SNIWritePacket (SafeHandle pConn, SafeHandle пакет, логическая синхронизация)
at System.Data.SqlClient.TdsParserStateObject.SNIWritePacket (SNIHandle дескриптор, пакет SNIPacket, UInt32 & sniError, логическое canAccumulate, Boolean callerHasConnectionLock)
at System.Data.SqlClient.TdsParserStateObject.WriteSni (Boolean может накапливаться)
на System.Data.SqlClient.TdsParserStateObject.WritePacket (Byte flushMode, Boolean canAccumulate)
at System.Data.SqlClient.TdsParserStateObject.ExecuteFlush ()
в System.Data.SqlClient.TdsParser.TdsExecuteSQLBatch (текст строки, Int32 тайм-аут, SqlNotificationRequesttificationRequest, TdsParserStateObject stateObj, логическая синхронизация, логическая callerHasConnectionLock, Byte [] enclavePackage)
в System.Data.SqlClient.SqlCommand.RunExecuteReaderTds (CommandBehavior cmdBehavior, RunBehavior runBehavior, логическое returnStream, логическое async, Int32 timeout, Task & task, логическое asyncWrite, логическое inRetry, SqlDataReader ds, Boolean descriptionParameterEncryptionRequest)
в System.Data.SqlClient.SqlCommand.RunExecuteReader (CommandBehavior cmdBehavior, RunBehavior runBehavior, логическое returnStream, строка метод, завершение TaskCompletionSource`1, таймаут Int32, Task & task, Boolean & usedCache, Boolean asyncWrite, Boolean inRetry)
в System.Data.SqlClient.SqlCommand.RunExecuteReader (CommandBehavior cmdBehavior, RunBehavior runBehavior, логическое returnStream, строка метод)
на System.Data.SqlClient.SqlCommand.ExecuteReader (CommandBehavior поведение, строковый метод)
at 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 голосов
/ 13 января 2019

Джастин Стеннинг был прав в в своем комментарии :

Вместо этого попробуйте uint * или ref uint, чтобы правильно сопоставить собственную подпись LPDWORD.

У меня была неправильная подпись.

...