P / Invoke是否定义了RtlCrc32和RtlCrc64函数?

时间:2019-03-17 01:08:18

标签: c# .net winapi pinvoke crc

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

我知道托管代码中现有的CRC-32算法,但是我宁愿采用Microsoft Windows的方式,以免由于校验和计算的经验不足而导致人为错误和/或性能下降。

这些是在 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 ++不熟悉,所以我有一些疑问...首先,我不知道这些函数是否返回NTSATUS错误代码,或者它们分别返回DWORD和ULONGLONG。其次,我不需要传递给InitialCrc参数。

1 个答案:

答案 0 :(得分:1)

您的定义很好。这些函数返回CRC值而不是错误代码。

将缓冲区声明为if (currentMode == prot.dataMode) { queueAppend(sessionData,message); } 并让封送处理程序为您固定数组,避免复制会更容易。

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