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; }
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); }
public static void *DeviceDsmOutputBlock([NativeTypeName("PDEVICE_DSM_OUTPUT")] DEVICE_MANAGE_DATA_SET_ATTRIBUTES_OUTPUT *Output) { return((void *)((nuint)(Output) + Output->OutputBlockOffset)); }