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

📄 rtl.c

📁 linux下安装无线网卡启动的程式
💻 C
📖 第 1 页 / 共 2 页
字号:
		EXIT2(return STATUS_INVALID_PARAMETER);	while (*string == ' ')		string++;	if (*string == '+')		string++;	else if (*string == '-') {		string++;		sign = -1;	}	if (base == 0) {		base = 10;		if (*string == '0') {			string++;			if (*string == 'b') {				base = 2;				string++;			} else if (*string == 'o') {				base = 8;				string++;			} else if (*string == 'x') {				base = 16;				string++;			}		}	}	if (!(base == 2 || base == 8 || base == 10 || base == 16))		EXIT2(return STATUS_INVALID_PARAMETER);	for (res = 0; *string; string++) {		int v;		if (isdigit(*string))			v = *string - '0';		else if (isxdigit(*string))			v = tolower(*string) - 'a' + 10;		else			v = base;		if (v >= base)			EXIT2(return STATUS_INVALID_PARAMETER);		res = res * base + v;	}	*value = sign * res;	EXIT3(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 < ustring->max_length / sizeof(*buf); 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);	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(RtlUpcaseUnicodeString,3)	(struct unicode_string *dst, struct unicode_string *src, BOOLEAN alloc){	USHORT i, n;	if (alloc) {		dst->buf = ExAllocatePoolWithTag(NonPagedPool, src->length, 0);		if (dst->buf) {			dst->max_length = src->length;		} else			EXIT2(return STATUS_NO_MEMORY);	} else {		if (dst->max_length < src->length)			EXIT2(return STATUS_BUFFER_OVERFLOW);	}	n = src->length / sizeof(src->buf[0]);	for (i = 0; i < n; i++)		dst->buf[i] = toupper(src->buf[i]);	dst->length = src->length;	EXIT3(return STATUS_SUCCESS);}wstdcall void WIN_FUNC(RtlInitUnicodeString,2)	(struct unicode_string *dst, const wchar_t *src){	ENTER2("%p", dst);	if (dst == NULL)		EXIT1(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]);	}	EXIT1(return);}wstdcall void WIN_FUNC(RtlInitAnsiString,2)	(struct ansi_string *dst, const char *src){	ENTER2("%p", dst);	if (dst == NULL)		EXIT2(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;	}	TRACE2("%p", dst->buf);	EXIT2(return);}wstdcall void WIN_FUNC(RtlInitString,2)	(struct ansi_string *dst, const char *src){	ENTER2("%p", dst);	RtlInitAnsiString(dst, src);	EXIT2(return);}wstdcall void WIN_FUNC(RtlFreeUnicodeString,1)	(struct unicode_string *string){	ENTER2("%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){	ENTER2("%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);		EXIT2(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;	ENTER3("%x, %p", relative, tbl);//	TODO();	RtlInitUnicodeString(&unicode, path);	if (RtlUnicodeStringToAnsiString(&ansi, &unicode, TRUE) ==	    STATUS_SUCCESS) {		TRACE2("%s", ansi.buf);		RtlFreeAnsiString(&ansi);	}	ret = STATUS_SUCCESS;	for (; tbl->name; tbl++) {		RtlInitUnicodeString(&unicode, tbl->name);		if (RtlUnicodeStringToAnsiString(&ansi, &unicode, TRUE) ==		    STATUS_SUCCESS) {			TRACE2("name: %s", ansi.buf);			RtlFreeAnsiString(&ansi);		}		TRACE2("flags: %08X", tbl->flags);		if (tbl->flags == RTL_QUERY_REGISTRY_DIRECT) {			TRACE2("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) {					TRACE2("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;;			}			TRACE2("calling query_func: %p", tbl->query_func);			status = LIN2WIN6(tbl->query_func, tbl->name, type,					  data, length, context, env);			TRACE2("status: %08X", status);			if (status) {				if (status == STATUS_BUFFER_TOO_SMALL)					ret = STATUS_BUFFER_TOO_SMALL;				else					EXIT2(return STATUS_INVALID_PARAMETER);			}		}	}	EXIT3(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;	ENTER3("%d", relative);	TODO();	RtlInitUnicodeString(&unicode, path);	if (RtlUnicodeStringToAnsiString(&ansi, &unicode, TRUE) ==	    STATUS_SUCCESS) {		TRACE2("%s", ansi.buf);		RtlFreeAnsiString(&ansi);	}	RtlInitUnicodeString(&unicode, name);	if (RtlUnicodeStringToAnsiString(&ansi, &unicode, TRUE) ==	    STATUS_SUCCESS) {		TRACE2("%s", ansi.buf);		RtlFreeAnsiString(&ansi);	}	EXIT5(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"int rtl_init(void){	return 0;}/* called when module is being removed */void rtl_exit(void){	EXIT4(return);}

⌨️ 快捷键说明

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