In C++, you can simply assign one struct to another:
*pvi = Vih;
In C, you would use memcpy
memcpy(pvi,&Vih,sizeof(VIDEOINFOHEADER));
In your particular case, why are you initializing the intermediate Vih object?
After you have decleared and allocated the pvi pointer, you can just go
pvi->aaa = xxx;
pvi->bbb = yyy;
...
and so on to initialize the videoinfoheader. If that -> syntax is onerous, then you could create a temporary reference to the pointed to data:
DECLARE_PTR(VIDEOINFOHEADER, pvi, pmt->AllocFormatBuffer(sizeof(VIDEOINFOHEADER)));
ZeroMemory(pvi, sizeof(VIDEOINFOHEADER));
//initialize pvi, using a temporary reference that allows the convenient . notation
VIDEOINFOHEADER& Vih = *pvi;
Vih.aaa = xxx;
Vih.bbb = yyy;
...
// pvi is now initialized as pvi and Vih are both referencing the same memory, just
// using different syntaxes.