misc_funcs.c

来自「改文件可以安装无线网卡在linux下的驱动,大家可以在网站上查找一下用法」· C语言 代码 · 共 934 行 · 第 1/2 页

C
934
字号
	return (a % b);}STDCALL u64 WRAP_EXPORT(_aullrem)	(u64 a, u64 b){	return (a % b);}__attribute__ ((regparm(3))) s64 WRAP_EXPORT(_allshl)	(s64 a, u8 b){	return (a << b);}__attribute__ ((regparm(3))) u64 WRAP_EXPORT(_aullshl)	(u64 a, u8 b){	return (a << b);}__attribute__ ((regparm(3))) s64 WRAP_EXPORT(_allshr)	(s64 a, u8 b){	return (a >> b);}__attribute__ ((regparm(3))) u64 WRAP_EXPORT(_aullshr)	(u64 a, u8 b){	return (a >> b);}STDCALL SIZE_T WRAP_EXPORT(RtlCompareMemory)	(const void *a, const void *b, SIZE_T len){	size_t i;	char *x, *y;	TRACEENTER1("%s", "");	x = (char *)a;	y = (char *)b;	/* MSDN says this should return number of bytes that compare as	 * equal. This can be interpretted as either all bytes that are	 * equal in 'len' bytes or that only until the bytes compare as	 * not equal. Initially we had it the former way, but Realtek driver	 * doesn't like it that way - it takes many attempts to associate	 * with WPA. ReactOS returns the number of bytes that are equal	 * upto when they compare as not equal.	 * According to lords at #reactos, that is the way it should be	 * and that msdn is wrong about it!	 */	for (i = 0; i < len && x[i] == y[i]; i++)		;	return i;}STDCALL void WRAP_EXPORT(RtlCopyMemory)	(void *dst, const void *src, SIZE_T length){	memcpy(dst, src, length);}STDCALL LONG WRAP_EXPORT(RtlCompareString)	(const struct ansi_string *s1, const struct ansi_string *s2,	 BOOLEAN case_insensitive){	unsigned int len;	LONG ret = 0;	const char *p1, *p2;	TRACEENTER1("%s", "");	len = min(s1->len, s2->len);	p1 = s1->buf;	p2 = s2->buf;	if (case_insensitive)		while (!ret && len--)			ret = toupper(*p1++) - toupper(*p2++);	else		while (!ret && len--)			ret = *p1++ - *p2++;	if (!ret)		ret = s1->len - s2->len;	return ret;}STDCALL LONG WRAP_EXPORT(RtlCompareUnicodeString)	(const struct unicode_string *s1, const struct unicode_string *s2,	 BOOLEAN case_insensitive){	unsigned int len;	LONG ret = 0;	const wchar_t *p1, *p2;	TRACEENTER1("%s", "");	len = min(s1->len, s2->len);	p1 = s1->buf;	p2 = s2->buf;	if (case_insensitive)		while (!ret && len--)			ret = toupper((u8)*p1++) - toupper((u8)*p2++);	else		while (!ret && len--)			ret = *p1++ - *p2++;	if (!ret)		ret = s1->len - s2->len;	return ret;}STDCALL BOOLEAN WRAP_EXPORT(RtlEqualString)	(const struct ansi_string *s1, const struct ansi_string *s2,	 BOOLEAN case_insensitive){	TRACEENTER1("%s", "");	if (s1->len != s2->len)		return 0;	return !RtlCompareString(s1, s2, case_insensitive);}STDCALL BOOLEAN WRAP_EXPORT(RtlEqualUnicodeString)	(const struct unicode_string *s1, const struct unicode_string *s2,	 BOOLEAN case_insensitive){	if (s1->len != s2->len)		return 0;	return !RtlCompareUnicodeString(s1, s2, case_insensitive);}STDCALL void WRAP_EXPORT(RtlCopyUnicodeString)	(struct unicode_string *dst, struct unicode_string *src){	TRACEENTER1("%s", "");	if (src) {		unsigned int len = min(src->len, dst->buflen);		memcpy(dst->buf, src->buf, len);		dst->len = len;		/* append terminating '\0' if enough space */		if (len < dst->buflen)			dst->buf[len] = 0;	}	else dst->len = 0;	TRACEEXIT1(return);}STDCALL NTSTATUS WRAP_EXPORT(RtlAnsiStringToUnicodeString)	(struct unicode_string *dst, struct ansi_string *src, BOOLEAN dup){	int i;	wchar_t *d;	char *s;	TRACEENTER2("dup: %d src: %s", dup, src->buf);	if (dup) {		wchar_t *buf = kmalloc((src->buflen+1) * sizeof(wchar_t),				       GFP_KERNEL);		if (!buf)			TRACEEXIT1(return NDIS_STATUS_FAILURE);		dst->buf = buf;		dst->buflen = (src->buflen+1) * sizeof(wchar_t);	}	else if (dst->buflen < (src->len+1) * sizeof(wchar_t))		TRACEEXIT1(return NDIS_STATUS_FAILURE);	dst->len = src->len * sizeof(wchar_t);	d = dst->buf;	s = src->buf;	for(i = 0; i < src->len; i++)		d[i] = s[i];	d[i] = 0;	DBGTRACE2("len = %d", dst->len);	TRACEEXIT2(return NDIS_STATUS_SUCCESS);}STDCALL NTSTATUS WRAP_EXPORT(RtlUnicodeStringToAnsiString)	(struct ansi_string *dst, struct unicode_string *src, BOOLEAN dup){	int i;	wchar_t *s;	char *d;	TRACEENTER2("dup: %d src->len: %d src->buflen: %d, src->buf: %p,"		    "dst: %p", dup, src->len, src->buflen, src->buf, dst);	if (dup) {		char *buf = kmalloc((src->buflen+1) / sizeof(wchar_t),				    GFP_KERNEL);		if (!buf)			return NDIS_STATUS_FAILURE;		dst->buf = buf;		dst->buflen = (src->buflen+1) / sizeof(wchar_t);	} else if (dst->buflen < (src->len+1) / sizeof(wchar_t))		return NDIS_STATUS_FAILURE;	dst->len = src->len / sizeof(wchar_t);	s = src->buf;	d = dst->buf;	for(i = 0; i < dst->len; i++)		d[i] = s[i];	d[i] = 0;	DBGTRACE2("len = %d", dst->len);	DBGTRACE2("string: %s", dst->buf);	TRACEEXIT2(return NDIS_STATUS_SUCCESS);}STDCALL NTSTATUS WRAP_EXPORT(RtlUnicodeStringToInteger)	(struct unicode_string *ustring, ULONG base, ULONG *value){	int negsign;	wchar_t *str;	*value = 0;	if (ustring->buflen <= 0)		return STATUS_INVALID_PARAMETER;	str = ustring->buf;	negsign = 0;	switch ((char)*str) {	case '-':		negsign = 1;		/* fall through */	case '+':		str++;		break;	}		       	if (base == 0 &&	    (void *)str < (void *)&ustring->buf[ustring->buflen]) {		switch(tolower((char)*str)) {		case 'x':			base = 16;			str++;			break;		case 'o':			base = 8;			str++;			break;		case 'b':			base = 2;			str++;			break;		default:			base = 10;			break;		}	}	if (!(base == 2 || base == 8 || base == 10 || base == 16))		return STATUS_INVALID_PARAMETER;	for (; (void *)str < (void *)&ustring->buf[ustring->buflen]; str++) {		int r;		char c = tolower((char)*str);		if (c >= '0' && c <= '9')			r = c - '0';		else if (c >= 'a' && c <= 'f')			r = c - 'a' + 10;		else			break;		if (r >= base)			break;		*value = *value * base + r;	}	if (negsign)		*value *= -1;	return STATUS_SUCCESS;}STDCALL NTSTATUS WRAP_EXPORT(RtlIntegerToUnicodeString)	(ULONG value, ULONG base, struct unicode_string *ustring){	char string[sizeof(wchar_t) * 8 + 1];	struct ansi_string ansi;	int i;	TRACEENTER1("%s", "");	if (base == 0)		base = 10;	if (!(base == 2 || base == 8 || base == 10 || base == 16))		return NDIS_STATUS_INVALID_PARAMETER;	for (i = 0; value && i < sizeof(string); i++) {		int r;		r = value % base;		value /= base;		if (r < 10)			string[i] = r + '0';		else			string[i] = r + 'a' - 10;	}	if (i < sizeof(string))		string[i] = 0;	else		return NDIS_STATUS_BUFFER_TOO_SHORT;	ansi.buf = string;	ansi.len = strlen(string);	ansi.buflen = sizeof(string);	return RtlAnsiStringToUnicodeString(ustring, &ansi, 0);}STDCALL void WRAP_EXPORT(RtlInitUnicodeString)	(struct unicode_string *dest, wchar_t *src){	struct unicode_string *uc;	TRACEENTER1("%s", "");	uc = dest;	if (uc == NULL)		TRACEEXIT1(return);	if (src == NULL) {		dest->len = dest->buflen = 0;		dest->buf = NULL;	} else {		int i = 0;		while (src[i])			i++;		dest->buf = src;		dest->len = dest->buflen = i * 2;	}	TRACEEXIT1(return);}STDCALL void WRAP_EXPORT(RtlInitAnsiString)	(struct ansi_string *dst, CHAR *src){	TRACEENTER2("%s", "");	if (dst == NULL)		TRACEEXIT2(return);	if (src == NULL) {		dst->len = dst->buflen = 0;		dst->buf = NULL;		TRACEEXIT2(return);	}	dst->len = dst->buflen = strlen(src);	dst->buf = (char *)src;	TRACEEXIT2(return);}STDCALL void WRAP_EXPORT(RtlInitString)	(struct ansi_string *dst, CHAR *src){	TRACEENTER2("%s", "");	RtlInitAnsiString(dst, src);	TRACEEXIT2(return);}STDCALL void WRAP_EXPORT(RtlFreeUnicodeString)	(struct unicode_string *string){	if (string == NULL || string->buf == NULL)		return;	kfree(string->buf);	string->buflen = string->len = 0;	string->buf = NULL;	return;}STDCALL void WRAP_EXPORT(RtlFreeAnsiString)	(struct ansi_string *string){	if (string == NULL || string->buf == NULL)		return;	kfree(string->buf);	string->buflen = string->len = 0;	string->buf = NULL;	return;}STDCALL NTSTATUS WRAP_EXPORT(RtlQueryRegistryValues)	(ULONG relative, const wchar_t *path, void *tbl, void *context,	 void *env){	TRACEENTER5("%s", "");	UNIMPL();	TRACEEXIT5(return STATUS_SUCCESS);}STDCALL NTSTATUS WRAP_EXPORT(RtlWriteRegistryValue)	(ULONG relative, const wchar_t *path, const wchar_t *name, ULONG type,	 void *data, ULONG length){	TRACEEXIT5(return STATUS_SUCCESS);}STDCALL void WRAP_EXPORT(RtlAssert)	(char *failed_assertion, char *file_name, ULONG line_num,	 char *message){	ERROR("assertion '%s' failed at %s line %d%s",	      failed_assertion, file_name, line_num, message ? message : "");	return;}STDCALL int WRAP_EXPORT(rand)	(void){	char buf[6];	int i, r;	get_random_bytes(buf, sizeof(buf));	for (r = i = 0; i < sizeof(buf) ; i++)		r += buf[i];	return r;}ULONGLONG ticks_1601(void){	struct timeval now;	ULONGLONG ticks;	do_gettimeofday(&now);	ticks = (ULONGLONG) now.tv_sec * TICKSPERSEC;	ticks += now.tv_usec * 10 + TICKS_1601_TO_1970;	return ticks;}void WRAP_EXPORT(RtlUnwind)(void){UNIMPL();}void *get_sp(void){	ULONG_PTR i;#ifdef CONFIG_X86_64	__asm__ __volatile__("movq %%rsp, %0\n" : "=g"(i));#else	__asm__ __volatile__("movl %%esp, %0\n" : "=g"(i));#endif	return (void *)i;}void dump_stack(void){	ULONG_PTR *sp = get_sp();	int i;	for (i = 0; i < 20; i++)		printk(KERN_DEBUG "sp[%d] = %p\n", i, (void *)sp[i]);}void dump_bytes(const char *where, const u8 *ip){	int i, j;	u8 code[50];	memset(code, 0, sizeof(code));	for (i = j = 0; i < 16; i++, j += 3) {		if (j+3 > sizeof(code))			ERROR("not enough space: %u > %u", j+3,			      (unsigned int)sizeof(code));		else			sprintf(&code[j], "%02x ", ip[i]);	}	code[sizeof(code)-1] = 0;	printk(KERN_DEBUG "%s: %p: %s\n", where, ip, code);}#include "misc_funcs_exports.h"

⌨️ 快捷键说明

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