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 + -
显示快捷键?