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 算法的输出进行比较时,您需要知道使用的是什么初始值。
我想为未记录的 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 算法的输出进行比较时,您需要知道使用的是什么初始值。