Exemple #1
0
    public static void DeviceDsmInitializeOutput([NativeTypeName("PDEVICE_DSM_DEFINITION")] DEVICE_DSM_DEFINITION *Definition, [NativeTypeName("PDEVICE_DSM_OUTPUT")] DEVICE_MANAGE_DATA_SET_ATTRIBUTES_OUTPUT *Output, [NativeTypeName("DWORD")] uint OutputLength, [NativeTypeName("DWORD")] uint Flags)
    {
        uint Bytes = 36;

        Unsafe.InitBlockUnaligned((Output), 0, (OutputLength));
        Output->Size   = unchecked (Bytes);
        Output->Action = Definition->Action;
        Output->Flags  = Flags;
        if (Definition->OutputBlockLength != 0)
        {
            unchecked (Bytes)         = unchecked (((Bytes) + ((Definition->OutputBlockAlignment) - 1)) / (Definition->OutputBlockAlignment) * (Definition->OutputBlockAlignment));
            Output->OutputBlockOffset = unchecked (Bytes);
            Output->OutputBlockLength = unchecked (OutputLength - Bytes);
        }

        return;
    }
Exemple #2
0
    public static byte DeviceDsmValidateOutput([NativeTypeName("PDEVICE_DSM_DEFINITION")] DEVICE_DSM_DEFINITION *Definition, [NativeTypeName("PDEVICE_DSM_OUTPUT")] DEVICE_MANAGE_DATA_SET_ATTRIBUTES_OUTPUT *Output, [NativeTypeName("DWORD")] uint OutputLength)
    {
        uint Max = 0;

        uint Min   = 0;
        byte Valid = 0;

        if (Definition->Action != Output->Action)
        {
            goto Cleanup;
        }

        if (Definition->HasOutput == 0)
        {
            goto Cleanup;
        }

        if (Definition->OutputBlockLength != 0)
        {
            Min = unchecked ((uint)(sizeof(DEVICE_MANAGE_DATA_SET_ATTRIBUTES_OUTPUT)));
            Max = OutputLength;
            if (Output->OutputBlockOffset < Min || Output->OutputBlockOffset > Max || (Output->OutputBlockOffset % Definition->OutputBlockAlignment) != 0)
            {
                goto Cleanup;
            }

            Min = Definition->OutputBlockLength;
            Max = OutputLength - Output->OutputBlockOffset;
            if (Output->OutputBlockLength < Min || Output->OutputBlockLength > Max)
            {
                goto Cleanup;
            }
        }
        else
        {
            if (Output->OutputBlockOffset != 0 || Output->OutputBlockLength != 0)
            {
                goto Cleanup;
            }
        }

        Valid = 1;
Cleanup:
        return(Valid);
    }
Exemple #3
0
 public static void *DeviceDsmOutputBlock([NativeTypeName("PDEVICE_DSM_OUTPUT")] DEVICE_MANAGE_DATA_SET_ATTRIBUTES_OUTPUT *Output)
 {
     return((void *)((nuint)(Output) + Output->OutputBlockOffset));
 }