windows-nt/Source/XPSP1/NT/net/wlbs/nlbkd/utils.c
2020-09-26 16:20:57 +08:00

237 lines
5.5 KiB
C

/*
* File: utils.c
* Description: This file contains the implementation of some utility
* functions for the NLB KD extensions.
* Author: Created by shouse, 1.4.01
*/
#include "nlbkd.h"
#include "utils.h"
#include "print.h"
/*
* Function: ErrorCheckSymbols
* Description: Prints an error message when the symbols are bad.
* Author: Created by shouse, 1.4.01 - copied largely from ndiskd.dll
*/
VOID ErrorCheckSymbols (CHAR * symbol) {
dprintf("NLBKD: Error: Could not access %s - check symbols for wlbs.sys\n", symbol);
}
/*
* Function: mystrtok
* Description: Tokenizes a string via a configurable list of tokens.
* Author: Created by shouse, 1.4.01 - copied largely from ndiskd.dll
*/
char * mystrtok (char * string, char * control) {
static unsigned char * str;
CHAR * p;
CHAR * s;
if (string) str = string;
if (!str || (*str == '\0')) return NULL;
for (; *str; str++) {
for (s = control; *s; s++)
if (*str == *s) break;
if (*s == '\0') break;
}
if (*str == '\0') {
str = NULL;
return NULL;
}
for (p = str + 1; *p; p++) {
for (s = control; *s; s++) {
if(*p == *s) {
s = str;
*p = '\0';
str = p + 1;
return s;
}
}
}
s = str;
str = NULL;
return s;
}
/*
* Function: GetUlongFromAddress
* Description: Returns a ULONG residing at a given memory location.
* Author: Created by shouse, 1.4.01 - copied largely from ndiskd.dll
*/
ULONG GetUlongFromAddress (ULONG64 Location) {
ULONG result;
ULONG Value;
if ((!ReadMemory(Location, &Value, sizeof(ULONG), &result)) || (result < sizeof(ULONG))) {
dprintf("unable to read from %08x\n", Location);
return 0;
}
return Value;
}
/*
* Function: GetPointerFromAddress
* Description: Returns a memory address residing at a given memory location.
* Author: Created by shouse, 1.4.01 - copied largely from ndiskd.dll
*/
ULONG64 GetPointerFromAddress (ULONG64 Location) {
ULONG64 Value;
if (ReadPtr(Location,&Value)) {
dprintf("unable to read from %p\n", Location);
return 0;
}
return Value;
}
/*
* Function: GetData
* Description: Reads data from a memory location into a buffer.
* Author: Created by shouse, 1.4.01 - copied largely from ndiskd.dll
*/
BOOL GetData (IN LPVOID ptr, IN ULONG64 dwAddress, IN ULONG size, IN PCSTR type) {
ULONG count = size;
ULONG BytesRead;
BOOL b;
while (size > 0) {
if (count >= 3000) count = 3000;
b = ReadMemory(dwAddress, ptr, count, &BytesRead);
if (!b || BytesRead != count) {
dprintf("Unable to read %u bytes at %p, for %s\n", size, dwAddress, type);
return FALSE;
}
dwAddress += count;
size -= count;
ptr = (LPVOID)((ULONG_PTR)ptr + count);
}
return TRUE;
}
/*
* Function: GetString
* Description: Copies a string from memory into a buffer.
* Author: Created by shouse, 1.4.01 - copied largely from ndiskd.dll
*/
BOOL GetString (IN ULONG64 dwAddress, IN LPWSTR buf, IN ULONG MaxChars) {
do {
if (!GetData(buf, dwAddress, sizeof(*buf), "Character"))
return FALSE;
dwAddress += sizeof(*buf);
} while (--MaxChars && *buf++ != '\0');
return TRUE;
}
/*
* Function: GetMAC
* Description: Copies an ethernet MAC address from memory into a buffer.
* Author: Created by shouse, 1.14.01
*/
BOOL GetMAC (IN ULONG64 dwAddress, IN UCHAR * buf, IN ULONG NumChars) {
do {
if (!GetData(buf, dwAddress, sizeof(*buf), "Character"))
return FALSE;
dwAddress += sizeof(*buf);
buf++;
} while (--NumChars);
return TRUE;
}
/*
* Function: TCPPacketTypeToString
* Description: Returns a string corresponding to the enumerated TCP packet type.
* Author: Created by shouse, 4.14.01
*/
CHAR * TCPPacketTypeToString (TCP_PACKET_TYPE ePktType) {
switch (ePktType) {
case SYN:
return "SYN";
case DATA:
return "DATA";
case FIN:
return "FIN";
case RST:
return "RST";
default:
return "Unknown";
}
}
/*
* Function: Map
* Description: This IS the NLB hashing function.
* Author: Created by shouse, 4.14.01
*/
ULONG Map (ULONG v1, ULONG v2) {
ULONG y = v1;
ULONG z = v2;
ULONG sum = 0;
const ULONG a = 0x67; //key [0];
const ULONG b = 0xdf; //key [1];
const ULONG c = 0x40; //key [2];
const ULONG d = 0xd3; //key [3];
const ULONG delta = 0x9E3779B9;
sum += delta;
y += (z << 4) + a ^ z + sum ^ (z >> 5) + b;
z += (y << 4) + c ^ y + sum ^ (y >> 5) + d;
sum += delta;
y += (z << 4) + a ^ z + sum ^ (z >> 5) + b;
z += (y << 4) + c ^ y + sum ^ (y >> 5) + d;
sum += delta;
y += (z << 4) + a ^ z + sum ^ (z >> 5) + b;
z += (y << 4) + c ^ y + sum ^ (y >> 5) + d;
sum += delta;
y += (z << 4) + a ^ z + sum ^ (z >> 5) + b;
z += (y << 4) + c ^ y + sum ^ (y >> 5) + d;
sum += delta;
y += (z << 4) + a ^ z + sum ^ (z >> 5) + b;
z += (y << 4) + c ^ y + sum ^ (y >> 5) + d;
sum += delta;
y += (z << 4) + a ^ z + sum ^ (z >> 5) + b;
z += (y << 4) + c ^ y + sum ^ (y >> 5) + d;
sum += delta;
y += (z << 4) + a ^ z + sum ^ (z >> 5) + b;
z += (y << 4) + c ^ y + sum ^ (y >> 5) + d;
sum += delta;
y += (z << 4) + a ^ z + sum ^ (z >> 5) + b;
z += (y << 4) + c ^ y + sum ^ (y >> 5) + d;
return y ^ z;
}