jwalpmapi.pas

来自「比较全面的win32api开发包」· PAS 代码 · 共 1,676 行 · 第 1/4 页

PAS
1,676
字号
  PETYPE = USHORT;
  {$EXTERNALSYM PETYPE}

const
  LPM_OK = 0;
  {$EXTERNALSYM LPM_OK}

type
  MSG_TYPE = Integer;
  {$EXTERNALSYM MSG_TYPE}
  TMsgType = MSG_TYPE;

  rsvpmsgobjs = record
    RsvpMsgType: TMsgType;
    pRsvpSession: PRsvpSession;
    pRsvpFromHop: PRsvpHop;
    pRsvpToHop: PRsvpHop;
    pResvStyle: PResvStyle;
    pRsvpScope: PRsvpScope;
    FlowDescCount: Integer;
    pFlowDescs: PFlowDesc;
    PdObjectCount: Integer;
    ppPdObjects: ^PPolicyData;
    pErrorSpec: PErrorSpec;
    pAdspec: PADSpec;
  end;
  {$EXTERNALSYM rsvpmsgobjs}
  RSVP_MSG_OBJS = rsvpmsgobjs;
  {$EXTERNALSYM RSVP_MSG_OBJS}
  TRsvpMsgObjs = RSVP_MSG_OBJS;
  PRsvpMsgObjs = ^RSVP_MSG_OBJS;
  
  PALLOCMEM = function (Size: DWORD): Pointer; stdcall;
  {$EXTERNALSYM PALLOCMEM}
  TAllocMem = PALLOCMEM;

  PFREEMEM = procedure (pv: Pointer); stdcall;
  {$EXTERNALSYM PFREEMEM}
  TFreeMem = PFREEMEM;

  policy_decision = record
    lpvResult: LPV;        // Use the LPV values from above
    wPolicyErrCode: WORD;   // RSVP defined error codes
    wPolicyErrValue: WORD;  // RSVP defined error values
  end;
  {$EXTERNALSYM policy_decision}
  TPolicyDecision = policy_decision;
  PPolicyDecision = ^policy_decision;

  CBADMITRESULT = function (LpmHandle: LPM_HANDLE; RequestHandle: RHANDLE;
    ulPcmActionFlags: ULONG; LpmError: Integer; PolicyDecisionsCount: Integer;
    pPolicyDecisions: PPolicyDecision): ULONG; stdcall;
  {$EXTERNALSYM CBADMITRESULT}
  TCbAdmitResult = CBADMITRESULT;

  CBGETRSVPOBJECTS = function (LpmHandle: LPM_HANDLE; RequestHandle: RHANDLE;
    LpmError: Integer; RsvpObjectsCount: Integer; ppRsvpObjects: PPRsvpObjHdr): ULONG; stdcall;
  {$EXTERNALSYM CBGETRSVPOBJECTS}
  TCbGetRsvpObjects = CBGETRSVPOBJECTS;

// The above 2 call backs can return the following errors

const
  INV_LPM_HANDLE = 1; // Supplied LpmHandle is invalid
  {$EXTERNALSYM INV_LPM_HANDLE}
  LPM_TIME_OUT   = 2; // LPM has returned results after the time limit
  {$EXTERNALSYM LPM_TIME_OUT}
  INV_REQ_HANDLE = 3; // Supplied Request handle is invalid
  {$EXTERNALSYM INV_REQ_HANDLE}
  DUP_RESULTS    = 4; // LPM has already returned results for this request
  {$EXTERNALSYM DUP_RESULTS}
  INV_RESULTS    = 5; // Results supplied are invalid
  {$EXTERNALSYM INV_RESULTS}

type
  lpminitinfo = record
    PcmVersionNumber: DWORD;
    ResultTimeLimit: DWORD;
    ConfiguredLpmCount: Integer;
    AllocMemory: PALLOCMEM;
    FreeMemory: PFREEMEM;
    PcmAdmitResultCallback: CBADMITRESULT;
    GetRsvpObjectsCallback: CBGETRSVPOBJECTS;
  end;
  {$EXTERNALSYM lpminitinfo}
  LPM_INIT_INFO = lpminitinfo;
  {$EXTERNALSYM LPM_INIT_INFO}
  TLpmInitInfo = LPM_INIT_INFO;
  PLpmInitInfo = ^LPM_INIT_INFO;  

// Valid PE types
// XXX ISSUE - Is 0xFFFF a better choice?

const
  LPM_PE_ALL_TYPES = 0;
  {$EXTERNALSYM LPM_PE_ALL_TYPES}

// Current LPM API version number

  LPM_API_VERSION_1 = 1;
  {$EXTERNALSYM LPM_API_VERSION_1}

// Current PCM version number

  PCM_VERSION_1 = 1;
  {$EXTERNALSYM PCM_VERSION_1}

function LPM_Initialize(LpmHandle: LPM_HANDLE; const pLpmInitInfo: LPM_INIT_INFO;
  var pLpmVersionNumber: DWORD; var pSupportedPeType: PETYPE; Reserved: Pointer): ULONG; stdcall;
{$EXTERNALSYM LPM_Initialize}

(**************************************

    LPM_Deinitialize

***************************************)

function LPM_Deinitialize(LpmHandle: LPM_HANDLE): ULONG; stdcall;
{$EXTERNALSYM LPM_Deinitialize}

(**************************************

    LPM_AdmitRsvpMsg

***************************************)

// Valid LPV - LPM Priority Values

const
  LPV_RESERVED     = 0;
  {$EXTERNALSYM LPV_RESERVED}
  LPV_MIN_PRIORITY = 1;
  {$EXTERNALSYM LPV_MIN_PRIORITY}
  LPV_MAX_PRIORITY = $FF00;
  {$EXTERNALSYM LPV_MAX_PRIORITY}
  LPV_DROP_MSG     = $FFFD;
  {$EXTERNALSYM LPV_DROP_MSG}
  LPV_DONT_CARE    = $FFFE;
  {$EXTERNALSYM LPV_DONT_CARE}
  LPV_REJECT       = $FFFF;
  {$EXTERNALSYM LPV_REJECT}

// Valid values for PcmActionFlags

  FORCE_IMMEDIATE_REFRESH = 1;
  {$EXTERNALSYM FORCE_IMMEDIATE_REFRESH}

// Function return values for LPM_AdmitResvMsg

  LPM_RESULT_READY = 0;
  {$EXTERNALSYM LPM_RESULT_READY}
  LPM_RESULT_DEFER = 1;
  {$EXTERNALSYM LPM_RESULT_DEFER}

function LPM_AdmitRsvpMsg(PcmReqHandle: RHANDLE; const pRecvdIntf: RSVP_HOP;
  const pRsvpMsgObjs: RSVP_MSG_OBJS; RcvdRsvpMsgLength: Integer; RcvdRsvpMsg: PUCHAR;
  var pulPcmActionFlags: ULONG; pPolicyDecisions: PPolicyDecision; Reserved: Pointer): ULONG; stdcall;
{$EXTERNALSYM LPM_AdmitRsvpMsg}

(**************************************

    LPM_GetRsvpObjects

***************************************)

// Function return values are defined in LPM_AdmitResvMsg section

function LPM_GetRsvpObjects(PcmReqHandle: RHANDLE; MaxPdSize: ULONG;
  SendingIntfAddr: PRsvpHop; pRsvpMsgObjs: PRsvpMsgObjs; var pRsvpObjectsCount: Integer;
  var pppRsvpObjects: PRsvpObjHdr; Reserved: Pointer): ULONG; stdcall;
{$EXTERNALSYM LPM_GetRsvpObjects}

(**************************************

    LPM_DeleteState

***************************************)

// TearDown reasons

const
  RCVD_PATH_TEAR  = 1;
  {$EXTERNALSYM RCVD_PATH_TEAR}
  RCVD_RESV_TEAR  = 2;
  {$EXTERNALSYM RCVD_RESV_TEAR}
  ADM_CTRL_FAILED = 3;
  {$EXTERNALSYM ADM_CTRL_FAILED}
  STATE_TIMEOUT   = 4;
  {$EXTERNALSYM STATE_TIMEOUT}
  FLOW_DURATION   = 5;
  {$EXTERNALSYM FLOW_DURATION}


procedure LPM_DeleteState(pRcvdIfAddr: PRsvpHop; RsvpMsgType: TMsgType;
  pRsvpSession: PRsvpSession; pRsvpFromHop: PRsvpHop; pResvStyle: PResvStyle;
  FilterSpecCount: Integer; ppFilterSpecList: PFilterSpec; TearDownReason: Integer); stdcall;
{$EXTERNALSYM LPM_DeleteState}

(**************************************

    LPM_IpAddrTable

***************************************)

type
  lpmiptable = record
    ulIfIndex: ULONG;    // SNMP index for this interface
    MediaType: ULONG;    // As defined in IPIFCONS.H
    IfIpAddr: IN_ADDR;   // Interface IP address
    IfNetMask: IN_ADDR;  // Interface subnet mask
  end;
  {$EXTERNALSYM lpmiptable}
  TLpmIpTable = lpmiptable;
  PLpmIpTable = ^lpmiptable;

function LPM_IpAddressTable(cIpAddrTable: ULONG; pIpAddrTable: PLpmIpTable): BOOL; stdcall;
{$EXTERNALSYM LPM_IpAddressTable}

(**************************************

    LPM_CommitResv

***************************************)

// CommitDecision values

const
  RESOURCES_ALLOCATED = 1;
  {$EXTERNALSYM RESOURCES_ALLOCATED}
  RESOURCES_MODIFIED  = 2;
  {$EXTERNALSYM RESOURCES_MODIFIED}

procedure LPM_CommitResv(RsvpSession: PRsvpSession; FlowInstalledIntf: PRsvpHop;
  RsvpStyle: PResvStyle; FilterSpecCount: Integer; ppFilterSpecList: PFilterSpec;
  pMergedFlowSpec: PIsFlowSpec; CommitDecision: ULONG); stdcall;
{$EXTERNALSYM LPM_CommitResv}

implementation

function ObjLength(const x: TRsvpObjHdr): USHORT;
begin
  Result := x.obj_length;
end;

function ObjCType(const x: TRsvpObjHdr): UCHAR;
begin
  Result := x.obj_ctype;
end;

function ObjClass(const x: TRsvpObjHdr): UCHAR;
begin
  Result := x.obj_class;
end;

function ObjData(const x: TRsvpObjHdr): Pointer;
begin
  Result := Pointer(Integer(@x) + SizeOf(x));
end;

function Style_is_Wildcard(p: DWORD): Boolean;
begin
  Result := (p and Opt_SndSel_mask) = Opt_Wildcard;
end;

function Style_is_Shared(p: DWORD): Boolean;
begin
  Result := (p and Opt_Share_mask) = Opt_Shared;
end;

function Error_Usage(x: DWORD): DWORD;
begin
  Result := (x shr 12) and 3;
end;

function Intserv_Version(x: DWORD): DWORD;
begin
  Result := (x and INTSERV_VERS_MASK) shr 4;
end;

function Intserv_Version_OK(const x: TIntServMainHdr): Boolean;
begin
  Result := (x.ismh_version and INTSERV_VERS_MASK) = INTSERV_VERSION0;
end;

function Intserv_Obj_size(const x: TIntServMainHdr): DWORD;
begin
  Result := x.ismh_len32b * 4 + SizeOf(IntServMainHdr) + SizeOf(RsvpObjHdr);
end;

function Issh_len32b(const p: TIntServServiceHdr): USHORT;
begin
  Result := p.issh_len32b;
end;

const
  lpmlib = 'msidlpm.dll';


{$IFDEF DYNAMIC_LINK}
var
  _LPM_Initialize: Pointer;

function LPM_Initialize;
begin
  GetProcedureAddress(_LPM_Initialize, lpmlib, 'LPM_Initialize');
  asm
    mov esp, ebp
    pop ebp
    jmp [_LPM_Initialize]
  end;
end;
{$ELSE}
function LPM_Initialize; external lpmlib name 'LPM_Initialize';
{$ENDIF DYNAMIC_LINK}

{$IFDEF DYNAMIC_LINK}
var
  _LPM_Deinitialize: Pointer;

function LPM_Deinitialize;
begin
  GetProcedureAddress(_LPM_Deinitialize, lpmlib, 'LPM_Deinitialize');
  asm
    mov esp, ebp
    pop ebp
    jmp [_LPM_Deinitialize]
  end;
end;
{$ELSE}
function LPM_Deinitialize; external lpmlib name 'LPM_Deinitialize';
{$ENDIF DYNAMIC_LINK}

{$IFDEF DYNAMIC_LINK}
var
  _LPM_AdmitRsvpMsg: Pointer;

function LPM_AdmitRsvpMsg;
begin
  GetProcedureAddress(_LPM_AdmitRsvpMsg, lpmlib, 'LPM_AdmitRsvpMsg');
  asm
    mov esp, ebp
    pop ebp
    jmp [_LPM_AdmitRsvpMsg]
  end;
end;
{$ELSE}
function LPM_AdmitRsvpMsg; external lpmlib name 'LPM_AdmitRsvpMsg';
{$ENDIF DYNAMIC_LINK}

{$IFDEF DYNAMIC_LINK}
var
  _LPM_GetRsvpObjects: Pointer;

function LPM_GetRsvpObjects;
begin
  GetProcedureAddress(_LPM_GetRsvpObjects, lpmlib, 'LPM_GetRsvpObjects');
  asm
    mov esp, ebp
    pop ebp
    jmp [_LPM_GetRsvpObjects]
  end;
end;
{$ELSE}
function LPM_GetRsvpObjects; external lpmlib name 'LPM_GetRsvpObjects';
{$ENDIF DYNAMIC_LINK}

{$IFDEF DYNAMIC_LINK}
var
  _LPM_DeleteState: Pointer;

procedure LPM_DeleteState;
begin
  GetProcedureAddress(_LPM_DeleteState, lpmlib, 'LPM_DeleteState');
  asm
    mov esp, ebp
    pop ebp
    jmp [_LPM_DeleteState]
  end;
end;
{$ELSE}
procedure LPM_DeleteState; external lpmlib name 'LPM_DeleteState';
{$ENDIF DYNAMIC_LINK}

{$IFDEF DYNAMIC_LINK}
var
  _LPM_IpAddressTable: Pointer;

function LPM_IpAddressTable;
begin
  GetProcedureAddress(_LPM_IpAddressTable, lpmlib, 'LPM_IpAddressTable');
  asm
    mov esp, ebp
    pop ebp
    jmp [_LPM_IpAddressTable]
  end;
end;
{$ELSE}
function LPM_IpAddressTable; external lpmlib name 'LPM_IpAddressTable';
{$ENDIF DYNAMIC_LINK}

{$IFDEF DYNAMIC_LINK}
var
  _LPM_CommitResv: Pointer;

procedure LPM_CommitResv;
begin
  GetProcedureAddress(_LPM_CommitResv, lpmlib, 'LPM_CommitResv');
  asm
    mov esp, ebp
    pop ebp
    jmp [_LPM_CommitResv]
  end;
end;
{$ELSE}
procedure LPM_CommitResv; external lpmlib name 'LPM_CommitResv';
{$ENDIF DYNAMIC_LINK}

end.

⌨️ 快捷键说明

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