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

📄 pkdataqueueunit.pas

📁 Delphi版pe加壳程序
💻 PAS
字号:
unit PkDataQueueUnit;

interface

uses
  JwaWinnt, JwaWinBase,
  SysUtils, Classes;

type
  PPkData = ^TPkData;
  TPkData = record
    Ptr: Pointer;
    Len: Cardinal;
    PkDataType: Cardinal;
    Characteristic: Cardinal;
    Id: Array [0..15] of char;
  end;

  TPkDataQueue = class
  private
    FDataList: TList;
    function GetCount: integer;
    function GetData(index: integer): PPkData;
    function GetLength: Cardinal;
    procedure Clear;
  public
    constructor Create;
    destructor Destroy; override;
    function Add(Id: PChar): PPkData;
    function Get(id: String): PPkData;
    function GetOffset(id: String): Cardinal;
    property Count: integer read GetCount;
    property Len: Cardinal read GetLength;
    property Data[index: integer]: PPkData read GetData; default;
  end;

implementation

{ TPkDataQueue }

procedure TPkDataQueue.Clear;
var
  i: integer;
begin
  for i := FDataList.Count - 1 downto 0 do
  begin
    if PPkData(FDataList[i])^.Characteristic = 0 then
      FreeMem(PPkData(FDataList[i])^.Ptr);
    FreeMem(PPkData(FDataList[i]));
  end;
  FDataList.Clear;
end;

constructor TPkDataQueue.Create;
begin
  inherited;
  FDataList := TList.Create;
end;

destructor TPkDataQueue.Destroy;
begin
  Clear;
  FDataList.Free;
  inherited;
end;

function TPkDataQueue.Add(Id: PChar): PPkData;
var
  l: Cardinal;
begin
  result := AllocMem(SizeOf(TPkData));
  FDataList.Add(result);
  l := Length(Id);
  if l > 16 then
    l := 16;
  CopyMemory(@result^.Id, Id, l);
end;

function TPkDataQueue.Get(id: String): PPkData;
var
  i: integer;
begin
  result := nil;
  for i := 0 to FDataList.Count - 1 do
    if PPkData(FDataList[i])^.Id = id then
    begin
      result := PPkData(FDataList[i]);
      break;
    end;
end;

function TPkDataQueue.GetCount: integer;
begin
  result := FDataList.Count;
end;

function TPkDataQueue.GetData(index: integer): PPkData;
begin
  result := PPkData(FDataList[index]);
end;

function TPkDataQueue.GetOffset(id: String): Cardinal;
var
  i: integer;
begin
  result := 0;
  for i := 0 to FDataList.Count - 1 do
  begin
    if PPkData(FDataList[i])^.Id = id then
      break;
    Inc(result, PPkData(FDataList[i])^.Len);
  end;
end;

function TPkDataQueue.GetLength: Cardinal;
var
  i: integer;
begin
  result := 0;
  for i := 0 to FDataList.Count - 1 do
    Inc(result, PPkData(FDataList[i])^.Len);
end;

end.

⌨️ 快捷键说明

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