📄 rtl.c
字号:
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 + -