NTSTATUS MrQueryCallback( IN PWSTR ValueName, IN ULONG ValueType, IN PVOID ValueData, IN ULONG ValueLength, IN PVOID Context, IN PVOID EntryContext ) { if (NULL == ValueName || NULL == ValueData || 0 == ValueLength) return STATUS_SUCCESS; if (ValueType == REG_MULTI_SZ && wcslen(ValueName) == wcslen(MOURE_DEVLIST) && !_wcsnicmp(ValueName, MOURE_DEVLIST, wcslen(MOURE_DEVLIST))) { if (1024 > ValueLength) g_core.mc_dev_bytes = 1024; else g_core.mc_dev_bytes = ValueLength + sizeof(WCHAR); g_core.mc_dev_list = MrAlloc(g_core.mc_dev_bytes); if (g_core.mc_dev_list) RtlCopyMemory(g_core.mc_dev_list, ValueData, ValueLength); else g_core.mc_dev_bytes = 0; } return STATUS_SUCCESS; }
NTSTATUS MrQueryString( IN PDEVICE_OBJECT d, IN DEVICE_REGISTRY_PROPERTY c, IN OUT PUNICODE_STRING n ) { PWCHAR data = NULL; ULONG len = 0; NTSTATUS status; data = MrAlloc(1024); if (NULL == data) { status = STATUS_INSUFFICIENT_RESOURCES; goto errorout; } RtlZeroMemory(n, sizeof(UNICODE_STRING)); status = IoGetDeviceProperty(d, c, 1024, data, &len); if (!NT_SUCCESS(status)) { goto errorout; } len = wcslen(data) * sizeof(WCHAR); if (0 == len) { goto errorout; } n->MaximumLength = (USHORT)len + sizeof(WCHAR); n->Buffer = MrAlloc(n->MaximumLength); if (NULL == n->Buffer) { status = STATUS_INSUFFICIENT_RESOURCES; goto errorout; } RtlCopyMemory(n->Buffer, data, len); n->Length = (USHORT)len; errorout: if (data) MrFree(data); return status; }
NTSTATUS MrStartCore( IN PDRIVER_OBJECT drvobj, IN PUNICODE_STRING regpath ) { NTSTATUS status; __try { /* initialize core structure */ ExInitializeResourceLite(&g_core.mc_lock); InitializeListHead(&g_core.mc_dcb_list); /* store registry path */ g_core.mc_reg = *regpath; g_core.mc_reg.Buffer = MrAlloc(regpath->MaximumLength); if (g_core.mc_reg.Buffer) RtlCopyMemory(g_core.mc_reg.Buffer, regpath->Buffer, regpath->MaximumLength); /* query resitry */ status = MrQueryRegistry(regpath); if (!NT_SUCCESS(status)) { __leave; } /* create device object */ g_core.mc_devobj = MrCreateDevice(drvobj, MOURE_DEVICE, MOURE_SYMLNK); if (NULL == g_core.mc_devobj) { status = STATUS_INSUFFICIENT_RESOURCES; __leave; } } __finally { if (!NT_SUCCESS(status)) { /* do cleanup */ MrStopCore(); } } return status; }
static int ReadGenerators() { int i; MtxFile_t *f; f = MfOpen(GenName[0]); Permutations = f->Field == -1; MfClose(f); if (Permutations) { if (SubName != NULL || QuotName != NULL) { MTX_ERROR("'-s' and '-q' are not supported for permutations"); return -1; } for (i = 0; i < ngen; ++i) { Perm[i] = PermLoad(GenName[i]); if (Perm[i] == NULL) return -1; } } else { if ((Rep = MrAlloc(0,NULL,0)) == NULL) return -1; for (i = 0; i < ngen; ++i) { Matrix_t *gen; gen = MatLoad(GenName[i]); if (gen == NULL) return -1; if (MrAddGenerator(Rep,gen,0) != 0) { MTX_ERROR1("%s: cannot load generator",GenName[i]); return -1; } } } return 0; }
NTSTATUS MrQueryRegistry(IN PUNICODE_STRING RegistryPath) { RTL_QUERY_REGISTRY_TABLE QueryTable[2]; int i = 0; NTSTATUS status; RtlZeroMemory(&QueryTable[0], sizeof(QueryTable)); /* * 1 Device List (to be swapped) */ QueryTable[i].Flags = RTL_QUERY_REGISTRY_NOEXPAND; QueryTable[i].Name = MOURE_DEVLIST; QueryTable[i].DefaultType = REG_MULTI_SZ; QueryTable[i].DefaultLength = 0; QueryTable[i].DefaultData = NULL; QueryTable[i].EntryContext = NULL; QueryTable[i].QueryRoutine = MrQueryCallback; i++; status = RtlQueryRegistryValues( RTL_REGISTRY_ABSOLUTE, RegistryPath->Buffer, &QueryTable[0], NULL, NULL ); /* failed to query registry settings */ if (!NT_SUCCESS(status)) { if (!g_core.mc_dev_list) { g_core.mc_dev_bytes = 1024; g_core.mc_dev_list = MrAlloc(1024); } if (!g_core.mc_dev_list) g_core.mc_dev_bytes = 0; } return STATUS_SUCCESS; }
NTSTATUS MrUpdateHWs(ULONG s1, ULONG s2, PMR_DCB dcb) { PWCHAR s, p; ULONG b = 0, l, e, n; UNICODE_STRING t; NTSTATUS status = STATUS_SUCCESS; BOOLEAN changed = FALSE; e = g_core.mc_dev_bytes / sizeof(WCHAR); /* remove old tag */ if (s1 & MR_DEV_STATE_PERSIST) { while (s = MrLookupId(dcb)) { b = (ULONG)(s - g_core.mc_dev_list); l = wcslen(s); memset(s, 0, l * sizeof(WCHAR)); if (b + l + 1 < e) { memmove(s, s + l + 1, (e - b - l - 1) * sizeof(WCHAR)); memset(s + (e - b - l - 1), 0, (l + 1) * sizeof(WCHAR)); } changed = TRUE; } b = e - b - l; } /* add new tag */ if (s2 & MR_DEV_STATE_PERSIST) { n = dcb->md_did.Length / sizeof(WCHAR); if (p = MrStrStr(&dcb->md_did, L"&REV_", 5)) { if (p < dcb->md_did.Buffer + n) n = (ULONG)(p - dcb->md_did.Buffer); } if (p = MrStrStr(&dcb->md_did, L"&MI_", 4)) { if (p < dcb->md_did.Buffer + n) n = (ULONG)(p - dcb->md_did.Buffer); } if (p = MrStrStr(&dcb->md_did, L"&Col", 4)) { if (p < dcb->md_did.Buffer + n) n = (ULONG)(p - dcb->md_did.Buffer); } b = 0; while (b < g_core.mc_dev_bytes/sizeof(WCHAR)) { s = g_core.mc_dev_list + b; if (l = wcslen(s)) { b += l + 1; } else { break; } } if (e < b + n + 2) { s = MrAlloc((b + n + 0x100) * sizeof(WCHAR)); if (NULL == s) { status = STATUS_INSUFFICIENT_RESOURCES; goto errorout; } RtlCopyMemory(s, g_core.mc_dev_list, b*sizeof(WCHAR)); MrFree(g_core.mc_dev_list); g_core.mc_dev_list = s; e = b + n + 0x100; g_core.mc_dev_bytes = e * sizeof(WCHAR); } RtlCopyMemory(g_core.mc_dev_list + b, dcb->md_did.Buffer, n * sizeof(WCHAR)); b += n + 2; changed = TRUE; } if (changed) { /* set registry */ while (b >= 3) { if (g_core.mc_dev_list[b - 3] == 0 && g_core.mc_dev_list[b - 2] == 0 && g_core.mc_dev_list[b - 1] == 0 ) b = b - 1; else break; } status = MrSetRegValue(MOURE_DEVLIST, g_core.mc_dev_list, b * sizeof(WCHAR)); } errorout: return status; }