⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 dccrc.pas

📁 DiskControls.v3.8.Full.Source 控制磁盘的控件 包括源代码
💻 PAS
📖 第 1 页 / 共 2 页
字号:
         add    ebx, edi
         xor    ax, [ebx]
         loop   @@loop
@@done:
         mov    Result, ax
         pop    edx
         pop    ecx
         pop    ebx
         pop    eax
         pop    edi
         pop    esi
  {$ELSE}
         lea    di, Crc16Tab
         push   ds
         pop    es
         push   ds
         lds    si, Buffer
         mov    ax, InitCrc
         mov    cx, Length
         or     cx, cx
         jz     @@done
@@loop:
         xor    bx, bx
         mov    bl, ah
         mov    ah, al
         lodsb
         shl    bx, 1
         xor    ax, es:[di + bx]
         loop   @@loop
         pop    ds
@@done:
         mov    Result, ax
   {$ENDIF}
   end;
end;

function GetCRCArc(InitCRC: Word; var Buffer; Length: {$IFDEF Win32} LongInt {$ELSE} Word {$ENDIF}): Word;
begin
  asm
  {$IFDEF Win32}
         push   esi
         push   edi
         push   eax
         push   ebx
         push   ecx
         push   edx
         lea    edi, CrcArcTab
         mov    esi, Buffer
         mov    ax, InitCrc
         mov    ecx, Length
         or     ecx, ecx
         jz     @@done
@@loop:
         xor    ebx, ebx
         mov    bl, al
         lodsb
         xor    bl, al
         shl    bx, 1
         add    ebx, edi
         mov    bx, [ebx]
         xor    bl, ah
         mov    ax, bx
         loop   @@loop
@@done:
         mov    Result, ax
         pop    edx
         pop    ecx
         pop    ebx
         pop    eax
         pop    edi 
         pop    esi
  {$ELSE}
         lea    di, CrcArcTab
         push   ds
         pop    es
         push   ds
         lds    si, Buffer
         mov    ax, InitCrc
         mov    cx, Length
         or     cx, cx
         jz     @@done
@@loop:
         xor    bx, bx
         mov    bl, al
         lodsb
         xor    bl, al
         shl    bx, 1
         mov    bx, es:[di + bx]
         xor    bl, ah
         mov    ax, bx
         loop   @@loop
         pop    ds
@@done:
         mov    Result, ax
   {$ENDIF}
   end;
end;

function GetCRC32(InitCRC: {$IFDEF Win32}DWord{$ELSE}LongInt{$ENDIF}; var Buffer; Length: {$IFDEF Win32}DWord{$ELSE}Word{$ENDIF}): {$IFDEF Win32}DWord{$ELSE}LongInt{$ENDIF};
begin
  asm
{$IFDEF Win32}
         push   esi
         push   edi
         push   eax
         push   ebx
         push   ecx
         push   edx
         lea    edi, Crc32Tab
         mov    esi, Buffer
         mov    ax, word ptr InitCRC
         mov    dx, word ptr InitCRC + 2
         mov    ecx, Length
         or     ecx, ecx
         jz     @@done
@@loop:
         xor    ebx, ebx
         mov    bl, al
         lodsb
         xor    bl, al
         mov    al, ah
         mov    ah, dl
         mov    dl, dh
         xor    dh, dh
         shl    bx, 1
         shl    bx, 1
         add    ebx, edi
         xor    ax, [ebx]
         xor    dx, [ebx + 2]
         loop   @@loop
@@done:
         mov    word ptr Result, ax
         mov    word ptr Result + 2, dx
         pop    edx
         pop    ecx
         pop    ebx
         pop    eax
         pop    edi
         pop    esi
{$ELSE}
         push   ds
         pop    es
         push   ds
         lea    di, CRC32Tab
         lds    si, Buffer
         mov    ax, word ptr InitCRC
         mov    dx, word ptr InitCRC + 2
         mov    cx, Length
         or     cx, cx
         jz     @@done
@@loop:
         xor    bh, bh
         mov    bl, al
         lodsb
         xor    bl, al
         mov    al, ah
         mov    ah, dl
         mov    dl, dh
         xor    dh, dh
         shl    bx, 1
         shl    bx, 1
         xor    ax, es:[di + bx]
         xor    dx, es:[di + bx + 2]
         loop   @@loop
@@done:
         pop    ds
         mov    word ptr Result, ax
         mov    word ptr Result + 2, dx
{$ENDIF}
  end;
end;

function GetFileCRC(const FileName: String; Method: TCRCMethod): DWord;
var
  FileHandle: hFile;
  FileSize, tmp: DWord;
  Buffer: Pointer;
begin
  Result := 0;
  if FileExists(FileName) then
   begin
    FileHandle := CreateFile(PChar(FileName), GENERIC_READ, FILE_SHARE_READ or FILE_SHARE_WRITE, nil,
                          OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0);
    if FileHandle <> INVALID_HANDLE_VALUE then
     begin
      FileSize := GetFileSize(FileHandle, @tmp);     
      GetMem(Buffer, FileSize);
      try
        if ReadFile(FileHandle, Buffer^, FileSize, tmp, nil) then
         // Cyclic Redundency Checking
         case Method of
            crc32: Result := GetCrc32($FFFFFFFF, Buffer^, FileSize);
            crc16: Result := GetCrc16(0, Buffer^, FileSize);
           crcArc: Result := GetCrcArc(0, Buffer^, FileSize);
          end
        else
         Result := 0;
      finally
        FreeMem(Buffer);
      end;
      CloseHandle(FileHandle);
     end
   end;
end;

end.

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -