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