У вас есть несколько проблем с вашей декларацией, но та, которая дает вам не поддерживаемую ошибку, является параметром Attribute. DWORD_PTR - это не указатель, а целое число без знака размером с указатель, поэтому вместо указания он должен быть IntPtr.
Объявление, которое я бы использовал:
[DllImport("kernel32.dll", SetLastError = true)]
[return: MarshalAs(UnmanagedType.Bool)]
private static extern bool UpdateProcThreadAttribute(
IntPtr lpAttributeList, uint dwFlags, IntPtr Attribute,
IntPtr lpValue, IntPtr cbSize, IntPtr lpPreviousValue,
IntPtr lpReturnSize);
EDIT:
Я пытался сделать это как комментарий, но это не очень хорошо для кодирования.
Для дескриптора процесса вам нужен IntPtr для удержания дескриптора. Так что вам нужно что-то вроде:
IntPtr hProcess //previously retrieved.
IntPtr lpAttributeList //previously allocated using InitializeProcThreadAttributeList and Marshal.AllocHGlobal.
const int PROC_THREAD_ATTRIBUTE_PARENT_PROCESS = 0x00020000;
IntPtr lpValue = Marshal.AllocHGlobal(IntPtr.Size);
Marshal.WriteIntPtr(lpValue, hProcess);
if(UpdateProcThreadAttribute(lpAttributeList, 0, (IntPtr)PROC_THREAD_ATTRIBUTE_PARENT_PROCESS, lpValue, (IntPtr)IntPtr.Size, IntPtr.Zero, IntPtr.Zero))
{
//do something
}
//Free lpValue only after the lpAttributeList is deleted.