Почему `[DllImport]` завершается неудачно с точкой входа `RtlSecureZeroMemory`, даже если это хорошо документированная точка входа? - PullRequest
0 голосов
/ 09 ноября 2018

Попытка использовать функцию kernel32 SecureZeroMemory, используя приведенный ниже код, завершается неудачно с System.EntryPointNotFoundException - хотя это хорошо документировано здесь, в PInvoke и здесь, в SO . Запуск полностью нормальной Windows 10 Pro, на целевой .NET Framework 4.7.2.

        /// <summary>
        /// A kernel32 function that destroys all values in a block of memory
        /// </summary>
        /// <param name="destination">The pointer to the start of the block to be zeroed</param>
        /// <param name="length">The number of bytes to zero</param>
        /// <returns></returns>
        [DllImport("kernel32.dll", CharSet = CharSet.Auto, EntryPoint = "RtlSecureZeroMemory")]
        public static extern void SecureZeroMemory(IntPtr destination, IntPtr length);

1 Ответ

0 голосов
/ 09 ноября 2018

Эта функция задокументирована, но ни одна из ссылок, которые вы включаете, не является документацией. Чтобы понять, что происходит, вы должны начать с чтения фактической документации, которая находится здесь: https://msdn.microsoft.com/en-us/library/windows/desktop/aa366877(v=vs.85).aspx

Там написано:

Эта функция определена как функция RtlSecureZeroMemory (см. WinBase.h). Реализация RtlSecureZeroMemory предоставляется встроенной и может использоваться в любой версии Windows (см. WinNT.h.)

Что подразумевается под «предоставляемым встроенным», так это то, что функция определена в заголовочных файлах и не экспортируется какой-либо системной DLL. Это означает, что он не может быть вызван p / invoke.

...