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

📄 rtl.c

📁 ndiswrapper工具
💻 C
📖 第 1 页 / 共 2 页
字号:
			break;		case 'o':			base = 8;			i++;			break;		case 'b':			base = 2;			i++;			break;		default:			base = 10;			break;		}	}	if (!(base == 2 || base == 8 || base == 10 || base == 16))		return STATUS_INVALID_PARAMETER;	for ( ; i < ustring->length && str[i]; i++) {		int r;		char c = tolower((char)str[i]);		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;}wstdcall NTSTATUS WIN_FUNC(RtlIntegerToUnicodeString,3)	(ULONG value, ULONG base, struct unicode_string *ustring){	typeof(ustring->buf) buf = ustring->buf;	int i;	if (base == 0)		base = 10;	if (!(base == 2 || base == 8 || base == 10 || base == 16))		return STATUS_INVALID_PARAMETER;	for (i = 0; value && i * sizeof(buf[0]) < ustring->max_length; i++) {		int r;		r = value % base;		value /= base;		if (r < 10)			buf[i] = r + '0';		else			buf[i] = r + 'a' - 10;	}	if (value)		return STATUS_BUFFER_OVERFLOW;	ustring->length = i * sizeof(buf[0]);	return STATUS_SUCCESS;}wstdcall LARGE_INTEGER WIN_FUNC(RtlConvertUlongToLargeInteger,1)	(ULONG ul){	LARGE_INTEGER li = ul;	return li;}wfastcall USHORT WIN_FUNC(RtlUShortByteSwap,1)	(USHORT src){	return __swab16(src);}wfastcall ULONG WIN_FUNC(RtlUlongByteSwap,1)	(ULONG src){	/* ULONG is 32 bits for both 32-bit and 64-bit architectures */	return __swab32(src);}wstdcall NTSTATUS WIN_FUNC(NdisUpcaseUnicodeString,2)	(struct unicode_string *dst, struct unicode_string *src){	USHORT i, n;	n = min(src->length, src->max_length);	n = min(n, dst->length);	n = min(n, dst->max_length);	n /= sizeof(dst->buf[0]);	for (i = 0; i < n; i++) {		char *c = (char *)&dst->buf[i];		*c = toupper(src->buf[i]);	}	TRACEEXIT3(return STATUS_SUCCESS);}wstdcall void WIN_FUNC(RtlInitUnicodeString,2)	(struct unicode_string *dst, const wchar_t *src){	TRACEENTER2("%p", dst);	if (dst == NULL)		TRACEEXIT1(return);	if (src == NULL) {		dst->max_length = dst->length = 0;		dst->buf = NULL;	} else {		int i;		for (i = 0; (char)src[i]; i++)			;		dst->buf = (typeof(dst->buf))src;		dst->length = i * sizeof(dst->buf[0]);		dst->max_length = (i + 1) * sizeof(dst->buf[0]);	}	TRACEEXIT1(return);}wstdcall void WIN_FUNC(RtlInitAnsiString,2)	(struct ansi_string *dst, const char *src){	TRACEENTER2("%p", dst);	if (dst == NULL)		TRACEEXIT2(return);	if (src == NULL) {		dst->max_length = dst->length = 0;		dst->buf = NULL;	} else {		int i;		for (i = 0; src[i]; i++)			;		dst->buf = (typeof(dst->buf))src;		dst->length = i;		dst->max_length = i + 1;	}	DBGTRACE2("%p", dst->buf);	TRACEEXIT2(return);}wstdcall void WIN_FUNC(RtlInitString,2)	(struct ansi_string *dst, const char *src){	TRACEENTER2("%p", dst);	RtlInitAnsiString(dst, src);	TRACEEXIT2(return);}wstdcall void WIN_FUNC(RtlFreeUnicodeString,1)	(struct unicode_string *string){	TRACEENTER2("%p", string);	if (string == NULL)		return;	if (string->buf)		ExFreePool(string->buf);	string->length = string->max_length = 0;	string->buf = NULL;	return;}wstdcall void WIN_FUNC(RtlFreeAnsiString,1)	(struct ansi_string *string){	TRACEENTER2("%p", string);	if (string == NULL)		return;	if (string->buf)		ExFreePool(string->buf);	string->length = string->max_length = 0;	string->buf = NULL;	return;}/* guid string is of the form: {XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX} */wstdcall NTSTATUS WIN_FUNC(RtlGUIDFromString,2)	(struct unicode_string *guid_string, struct guid *guid){	struct ansi_string ansi;	NTSTATUS ret;	int i, j, k, l, m;	ret = RtlUnicodeStringToAnsiString(&ansi, guid_string, TRUE);	if (ret != STATUS_SUCCESS)		return ret;	if (ansi.length != 37 || ansi.buf[0] != '{' ||	    ansi.buf[36] != '}' || ansi.buf[9] != '-' ||	    ansi.buf[14] != '-' || ansi.buf[19] != '-' ||	    ansi.buf[24] != '-') {		RtlFreeAnsiString(&ansi);		TRACEEXIT2(return STATUS_INVALID_PARAMETER);	}	memcpy(&guid->data4, &ansi.buf[29], sizeof(guid->data3));	/* set end of data3 for scanf */	ansi.buf[29] = 0;	if (sscanf(&ansi.buf[1], "%x", &i) == 1 &&	    sscanf(&ansi.buf[10], "%x", &j) == 1 &&	    sscanf(&ansi.buf[15], "%x", &k) == 1 &&	    sscanf(&ansi.buf[20], "%x", &l) == 1 &&	    sscanf(&ansi.buf[25], "%x", &m) == 1) {		guid->data1 = (i << 16) | (j < 8) | k;		guid->data2 = l;		guid->data3 = m;		ret = STATUS_SUCCESS;	} else		ret = STATUS_INVALID_PARAMETER;	RtlFreeAnsiString(&ansi);	return ret;}wstdcall NTSTATUS WIN_FUNC(RtlQueryRegistryValues,5)	(ULONG relative, wchar_t *path, struct rtl_query_registry_table *tbl,	 void *context, void *env){	struct ansi_string ansi;	struct unicode_string unicode;	NTSTATUS status, ret;	static int i = 0;	TRACEENTER3("%x, %p", relative, tbl);//	TODO();	RtlInitUnicodeString(&unicode, path);	if (RtlUnicodeStringToAnsiString(&ansi, &unicode, TRUE) ==	    STATUS_SUCCESS) {		DBGTRACE2("%s", ansi.buf);		RtlFreeAnsiString(&ansi);	}	ret = STATUS_SUCCESS;	for (; tbl->name; tbl++) {		RtlInitUnicodeString(&unicode, tbl->name);		if (RtlUnicodeStringToAnsiString(&ansi, &unicode, TRUE) ==		    STATUS_SUCCESS) {			DBGTRACE2("name: %s", ansi.buf);			RtlFreeAnsiString(&ansi);		}		DBGTRACE2("flags: %08X", tbl->flags);		if (tbl->flags == RTL_QUERY_REGISTRY_DIRECT) {			DBGTRACE2("type: %08X", tbl->def_type);			if (tbl->def_type == REG_DWORD) {				/* Atheros USB driver needs this, but				 * don't know where and how to get its				 * value */				if (tbl->def_data) {					DBGTRACE2("def_data: %x",						  *(int *)tbl->def_data);					*(DWORD *)tbl->context = 0x5f292a + i++;//						*(DWORD *)tbl->def_data;				} else					*(DWORD *)tbl->context = 0x2345dbe;			}		} else {			void *data;			ULONG type, length;			if (!tbl->query_func) {				ERROR("oops: no query_func");				ret = STATUS_INVALID_PARAMETER;				break;			}			if (tbl->flags & RTL_QUERY_REGISTRY_NOVALUE) {				data = NULL;				type = REG_NONE;				length = 0;			} else {				data = tbl->def_data;				type = tbl->def_type;				length = tbl->def_length;;			}			DBGTRACE2("calling query_func: %p", tbl->query_func);			status = LIN2WIN6(tbl->query_func, tbl->name, type,					  data, length, context, env);			DBGTRACE2("status: %08X", status);			if (status) {				if (status == STATUS_BUFFER_TOO_SMALL)					ret = STATUS_BUFFER_TOO_SMALL;				else					TRACEEXIT2(return STATUS_INVALID_PARAMETER);			}		}	}	TRACEEXIT3(return ret);}wstdcall NTSTATUS WIN_FUNC(RtlWriteRegistryValue,6)	(ULONG relative, wchar_t *path, wchar_t *name, ULONG type,	 void *data, ULONG length){	struct ansi_string ansi;	struct unicode_string unicode;	TRACEENTER3("%d", relative);	TODO();	RtlInitUnicodeString(&unicode, path);	if (RtlUnicodeStringToAnsiString(&ansi, &unicode, TRUE) ==	    STATUS_SUCCESS) {		DBGTRACE2("%s", ansi.buf);		RtlFreeAnsiString(&ansi);	}	RtlInitUnicodeString(&unicode, name);	if (RtlUnicodeStringToAnsiString(&ansi, &unicode, TRUE) ==	    STATUS_SUCCESS) {		DBGTRACE2("%s", ansi.buf);		RtlFreeAnsiString(&ansi);	}	TRACEEXIT5(return STATUS_SUCCESS);}wstdcall NTSTATUS WIN_FUNC(RtlDeleteRegistryValue,3)	(ULONG relative, wchar_t *path, wchar_t *name){	return STATUS_SUCCESS;}wstdcall void WIN_FUNC(RtlAssert,4)	(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;}void WIN_FUNC(RtlUnwind,0)	(void){	TODO();}#include "rtl_exports.h"

⌨️ 快捷键说明

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