📄 jwamswsock.pas
字号:
{$EXTERNALSYM NLA_BLOB_DATA_TYPE}
PNLA_BLOB_DATA_TYPE = ^NLA_BLOB_DATA_TYPE;
{$EXTERNALSYM PNLA_BLOB_DATA_TYPE}
TNlaBlobDataType = NLA_BLOB_DATA_TYPE;
PNlaBlobDataType = PNLA_BLOB_DATA_TYPE;
_NLA_CONNECTIVITY_TYPE = (
NLA_NETWORK_AD_HOC,
NLA_NETWORK_MANAGED,
NLA_NETWORK_UNMANAGED,
NLA_NETWORK_UNKNOWN);
{$EXTERNALSYM _NLA_CONNECTIVITY_TYPE}
NLA_CONNECTIVITY_TYPE = _NLA_CONNECTIVITY_TYPE;
{$EXTERNALSYM NLA_CONNECTIVITY_TYPE}
PNLA_CONNECTIVITY_TYPE = ^NLA_CONNECTIVITY_TYPE;
{$EXTERNALSYM PNLA_CONNECTIVITY_TYPE}
TNlaConnectivityType = NLA_CONNECTIVITY_TYPE;
PNlaConnectivityType = PNLA_CONNECTIVITY_TYPE;
_NLA_INTERNET = (
NLA_INTERNET_UNKNOWN,
NLA_INTERNET_NO,
NLA_INTERNET_YES);
{$EXTERNALSYM _NLA_INTERNET}
NLA_INTERNET = _NLA_INTERNET;
{$EXTERNALSYM NLA_INTERNET}
PNLA_INTERNET = ^NLA_INTERNET;
{$EXTERNALSYM PNLA_INTERNET}
TNlaInternet = NLA_INTERNET;
PNlaInternet = PNLA_INTERNET;
_NLA_BLOB = record
header: record
type_: NLA_BLOB_DATA_TYPE;
dwSize: DWORD;
nextOffset: DWORD;
end;
case Integer of
0: (
// header.type -> NLA_RAW_DATA
rawData: array [0..0] of CHAR);
1: (
// header.type -> NLA_INTERFACE
dwType: DWORD;
dwSpeed: DWORD;
adapterName: array [0..0] of CHAR);
2: (
// header.type -> NLA_802_1X_LOCATION
information: array [0..0] of CHAR);
3: (
// header.type -> NLA_CONNECTIVITY
type_: NLA_CONNECTIVITY_TYPE;
internet: NLA_INTERNET);
4: (
// header.type -> NLA_ICS
remote: record
speed: DWORD;
type_: DWORD;
state: DWORD;
machineName: array [0..255] of WCHAR;
sharedAdapterName: array [0..255] of WCHAR;
end);
end;
{$EXTERNALSYM _NLA_BLOB}
NLA_BLOB = _NLA_BLOB;
{$EXTERNALSYM NLA_BLOB}
PNLA_BLOB = ^NLA_BLOB;
{$EXTERNALSYM PNLA_BLOB}
LPNLA_BLOB = ^NLA_BLOB;
{$EXTERNALSYM LPNLA_BLOB}
TNlaBlob = NLA_BLOB;
PNlaBlob = PNLA_BLOB;
_WSAMSG = record
name: LPSOCKADDR; // Remote address
namelen: INT; // Remote address length
lpBuffers: LPWSABUF; // Data buffer array
dwBufferCount: DWORD; // Number of elements in the array
Control: WSABUF; // Control buffer
dwFlags: DWORD; // Flags
end;
{$EXTERNALSYM _WSAMSG}
WSAMSG = _WSAMSG;
{$EXTERNALSYM WSAMSG}
PWSAMSG = ^WSAMSG;
{$EXTERNALSYM PWSAMSG}
LPWSAMSG = ^WSAMSG;
{$EXTERNALSYM LPWSAMSG}
TWsaMsg = WSAMSG;
//
// Layout of ancillary data objects in the control buffer
//
_WSACMSGHDR = record
cmsg_len: SIZE_T;
cmsg_level: INT;
cmsg_type: INT;
// followed by UCHAR cmsg_data[]
end;
{$EXTERNALSYM _WSACMSGHDR}
WSACMSGHDR = _WSACMSGHDR;
{$EXTERNALSYM WSACMSGHDR}
PWSACMSGHDR = ^WSACMSGHDR;
{$EXTERNALSYM PWSACMSGHDR}
LPWSACMSGHDR = ^WSACMSGHDR;
{$EXTERNALSYM LPWSACMSGHDR}
TWsaCMsgHdr = WSACMSGHDR;
//
// Alignment macros for header and data members of
// the control buffer.
//
{ TODO
#define WSA_CMSGHDR_ALIGN(length) \
( ((length) + TYPE_ALIGNMENT(WSACMSGHDR)-1) & \
(~(TYPE_ALIGNMENT(WSACMSGHDR)-1)) ) \
#define WSA_CMSGDATA_ALIGN(length) \
( ((length) + MAX_NATURAL_ALIGNMENT-1) & \
(~(MAX_NATURAL_ALIGNMENT-1)) )
}
//
// WSA_CMSG_FIRSTHDR
//
// Returns a pointer to the first ancillary data object,
// or a null pointer if there is no ancillary data in the
// control buffer of the WSAMSG structure.
//
// LPCMSGHDR
// WSA_CMSG_FIRSTHDR (
// LPWSAMSG msg
// );
//
(* TODO
#define WSA_CMSG_FIRSTHDR(msg) \
( ((msg)->Control.len >= sizeof(WSACMSGHDR)) \
? (LPWSACMSGHDR)(msg)->Control.buf \
: (LPWSACMSGHDR)NULL )
*)
//
// WSA_CMSG_NXTHDR
//
// Returns a pointer to the next ancillary data object,
// or a null if there are no more data objects.
//
// LPCMSGHDR
// WSA_CMSG_NEXTHDR (
// LPWSAMSG msg,
// LPWSACMSGHDR cmsg
// );
//
{ TODO
#define WSA_CMSG_NXTHDR(msg, cmsg) \
( ((cmsg) == NULL) \
? WSA_CMSG_FIRSTHDR(msg) \
: ( ( ((u_char *)(cmsg) + \
WSA_CMSGHDR_ALIGN((cmsg)->cmsg_len) + \
sizeof(WSACMSGHDR) ) > \
(u_char *)((msg)->Control.buf) + \
(msg)->Control.len ) \
? (LPWSACMSGHDR)NULL \
: (LPWSACMSGHDR)((u_char *)(cmsg) + \
WSA_CMSGHDR_ALIGN((cmsg)->cmsg_len)) ) )
}
//
// WSA_CMSG_DATA
//
// Returns a pointer to the first byte of data (what is referred
// to as the cmsg_data member though it is not defined in
// the structure).
//
// u_char *
// WSA_CMSG_DATA (
// LPWSACMSGHDR pcmsg
// );
//
{ TODO
#define WSA_CMSG_DATA(cmsg) \
( (u_char *)(cmsg) + WSA_CMSGDATA_ALIGN(sizeof(WSACMSGHDR)) )
}
//
// WSA_CMSG_SPACE
//
// Returns total size of an ancillary data object given
// the amount of data. Used to allocate the correct amount
// of space.
//
// SIZE_T
// WSA_CMSG_SPACE (
// SIZE_T length
// );
//
{ TODO
#define WSA_CMSG_SPACE(length) \
(WSA_CMSGDATA_ALIGN(sizeof(WSACMSGHDR) + WSA_CMSGHDR_ALIGN(length)))
}
//
// WSA_CMSG_LEN
//
// Returns the value to store in cmsg_len given the amount of data.
//
// SIZE_T
// WSA_CMSG_LEN (
// SIZE_T length
// );
//
{ TODO
#define WSA_CMSG_LEN(length) \
(WSA_CMSGDATA_ALIGN(sizeof(WSACMSGHDR)) + length)
}
//
// Definition for flags member of the WSAMSG structure
// This is in addition to other MSG_xxx flags defined
// for recv/recvfrom/send/sendto.
//
const
MSG_TRUNC = $0100;
{$EXTERNALSYM MSG_TRUNC}
MSG_CTRUNC = $0200;
{$EXTERNALSYM MSG_CTRUNC}
MSG_BCAST = $0400;
{$EXTERNALSYM MSG_BCAST}
MSG_MCAST = $0800;
{$EXTERNALSYM MSG_MCAST}
type
LPFN_WSARECVMSG = function (s: TSocket; lpMsg: LPWSAMSG; lpdwNumberOfBytesRecvd: LPDWORD; lpOverlapped: LPWSAOVERLAPPED;
lpCompletionRoutine: LPWSAOVERLAPPED_COMPLETION_ROUTINE): INT; stdcall;
{$EXTERNALSYM LPFN_WSARECVMSG}
const
WSAID_WSARECVMSG: TGUID = (
D1: $f689d7c8; D2:$6f1f; D3:$436b; D4:($8a, $53, $e5, $4f, $e3, $51, $c3, $22));
{$EXTERNALSYM WSAID_WSARECVMSG}
implementation
const
mswsock_lib = 'mswsock.dll';
{$IFDEF DYNAMIC_LINK}
var
_WSARecvEx: Pointer;
function WSARecvEx;
begin
GetProcedureAddress(_WSARecvEx, mswsock_lib, 'WSARecvEx');
asm
mov esp, ebp
pop ebp
jmp [_WSARecvEx]
end;
end;
{$ELSE}
function WSARecvEx; external mswsock_lib name 'WSARecvEx';
{$ENDIF DYNAMIC_LINK}
{$IFDEF DYNAMIC_LINK}
var
_TransmitFile: Pointer;
function TransmitFile;
begin
GetProcedureAddress(_TransmitFile, mswsock_lib, 'TransmitFile');
asm
mov esp, ebp
pop ebp
jmp [_TransmitFile]
end;
end;
{$ELSE}
function TransmitFile; external mswsock_lib name 'TransmitFile';
{$ENDIF DYNAMIC_LINK}
{$IFDEF DYNAMIC_LINK}
var
_AcceptEx: Pointer;
function AcceptEx;
begin
GetProcedureAddress(_AcceptEx, mswsock_lib, 'AcceptEx');
asm
mov esp, ebp
pop ebp
jmp [_AcceptEx]
end;
end;
{$ELSE}
function AcceptEx; external mswsock_lib name 'AcceptEx';
{$ENDIF DYNAMIC_LINK}
{$IFDEF DYNAMIC_LINK}
var
_GetAcceptExSockaddrs: Pointer;
procedure GetAcceptExSockaddrs;
begin
GetProcedureAddress(_GetAcceptExSockaddrs, mswsock_lib, 'GetAcceptExSockaddrs');
asm
mov esp, ebp
pop ebp
jmp [_GetAcceptExSockaddrs]
end;
end;
{$ELSE}
procedure GetAcceptExSockaddrs; external mswsock_lib name 'GetAcceptExSockaddrs';
{$ENDIF DYNAMIC_LINK}
end.
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -