Ну там же получается, что в переменную lpMsgBuf записывается указатель на созданную строчку, а не сама строчка. Вот CLR и говорит, что указатель на указатель на строчку оно записывать отказывается. И это логично, поскольку управление объектами для сборщика мусора становится непонятным.
А ты не путаешь lpMsgBuf это параметр №5 а строка №7.
FORMAT_MESSAGE_ALLOCATE_BUFFER |
FORMAT_MESSAGE_FROM_SYSTEM |
FORMAT_MESSAGE_IGNORE_INSERTS,
Это все один параметр.
Тут либо явным образом нужно описывать структуру из этих вложенных указателей и подсовывать эту структуру в функцию, либо не использовать FORMAT_MESSAGE_ALLOCATE_BUFFER, а самому выделить буфер и пользоваться им.
...
Т.е. не вычислять адрес в месте вызова. Может поможет.
Насчет структуры разбираюсь, остальное не помогло, ошибка та же.