Ответ 1
Невозможно передать Nullable-тип в функцию PInvoke'd без каких-либо... интересных манипуляций с байтами в собственном коде, который почти наверняка не то, что вы хотите.
Если вам нужна возможность передать значение struct как NULL для собственного кода, объявите перегрузку вашего объявления PInvoke, которое принимает IntPtr вместо места и передает IntPtr.Zero
[DllImport("setupapi.dll", CharSet = CharSet.Auto, SetLastError = true)]
static extern IntPtr SetupDiGetClassDevs(ref Guid ClassGuid, ref int enumerator, IntPtr hwndParent, uint Flags);
[DllImport("setupapi.dll", CharSet = CharSet.Auto, SetLastError = true)]
static extern IntPtr SetupDiGetClassDevs(ref Guid ClassGuid, IntPtr enumerator, IntPtr hwndParent, uint Flags);
Примечание. Я добавил класс ref к первой подписи. Если нативная подпись может принимать NULL, это, скорее всего, тип указателя. Следовательно, вы должны передавать типы значений по ссылке.
Теперь вы можете совершать вызовы, например следующие
if (enumerator.HasValue) {
SetupDiGetClassDevs(someGuid, ref enumerator.Value, hwnd, flags);
} else {
SetupDiGetClassDevs(someGuid, IntPtr.Zero, hwnd, flags);
}