P/Invoke RtlCrc32 和 RtlCrc64 函数的定义?

P/Invoke definition for RtlCrc32 and RtlCrc64 functions?

我想为未记录的 RtlCrc32 and RtlCrc64 函数请求一个有效的 P/Invoke 定义。

我知道托管代码中现有的 CRC-32 算法,但我更喜欢使用 Microsoft Windows 方法来避免可能的人为错误 and/or 由于缺乏经验,我这边的负面表现校验和计算,仅此而已。

这些是在winnt.h头文件(Windows 10 SDK)中声明的函数:

//
//  Crc32 and Crc64 routines that use standardized algorithms
//

NTSYSAPI
DWORD
NTAPI
RtlCrc32(
    _In_reads_bytes_(Size) const void *Buffer,
    _In_ size_t Size,
    _In_ DWORD InitialCrc
    );

NTSYSAPI
ULONGLONG
NTAPI
RtlCrc64(
    _In_reads_bytes_(Size) const void *Buffer,
    _In_ size_t Size,
    _In_ ULONGLONG InitialCrc
    );

这就是我尝试过的:

[DllImport("NtDll.dll", SetLastError=false)]
public extern static uint RtlCrc32([In] IntPtr buffer, 
                                   [In] IntPtr size, 
                                   [In] uint initialCrc);

[DllImport("NtDll.dll", SetLastError=false)]
public extern static ulong RtlCrc64([In] IntPtr buffer, 
                                    [In] IntPtr size, 
                                    [In] ulong initialCrc);

和:

byte[] bytes = File.ReadAllBytes(@"C:\File.txt");
uint initialCrc = 0; // I tried to use 0x4C11DB7
                     // standarized polynomial value 
                     // just to try something random.

IntPtr buffer = Marshal.AllocHGlobal(bytes.Length);
Marshal.Copy(bytes, 0, buffer, bytes.Length);

uint crc32 = NativeMethods.RtlCrc32(buffer, new IntPtr(bytes.Length), initialCrc);

Console.WriteLine(crc32.ToString("X2"));

但是当我将返回值与任何其他计算 CRC-32 的程序进行比较时,我的值不对应。

因为我没有使用 C/C++ 的经验,所以我有一些疑问...首先我不知道函数 returns 是 NTSATUS 错误代码,还是 returns DWORD 和 ULONGLONG 分别。其次,我没有得到我需要传递给 InitialCrc 参数的内容。

你的定义没问题。函数 return CRC 值而不是错误代码。

将缓冲区声明为 byte[] 并让封送拆收器为您固定数组可能更容易,避免复制。

初始值是 CRC 算法输入的一部分。与其他 CRC 算法的输出进行比较时,您需要知道使用的是什么初始值。