Example #1
0
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;
}
Example #2
0
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;
}
Example #3
0
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;
}
Example #4
0
File: zsp.c Project: momtx/meataxe
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;
}
Example #5
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;
}
Example #6
0
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;
}