int32 PciHandle::write64(uint64 offset, uint64 value) { if(hDriver != INVALID_HANDLE_VALUE) { PCICFG_Request req; ULONG64 result; DWORD reslength = 0; req.bus = bus; req.dev = device; req.func = function; req.bytes = sizeof(uint64); req.reg = (uint32)offset; req.write_value = value; BOOL status = DeviceIoControl(hDriver, IO_CTL_PCICFG_WRITE, &req, sizeof(PCICFG_Request), &result, sizeof(uint64), &reslength, NULL); if (!status) { //std::cerr << "Error writing PCI Config space at bus "<<bus<<" dev "<< device<<" function "<< function <<" offset "<< offset << " size "<< req.bytes << ". Windows error: "<<GetLastError()<<std::endl; } return reslength; } cvt_ds cvt; cvt.ui64 = value; BOOL status = WritePciConfigDwordEx(pciAddress,(DWORD)offset,cvt.ui32.low); status &= WritePciConfigDwordEx(pciAddress,((DWORD)offset)+sizeof(uint32),cvt.ui32.high); return status?sizeof(uint64):0; }
BOOL SysWritePciConfigDwordEx(DWORD pciAddress, DWORD regAddress, DWORD value) { if (SpecialEcsAccessRequired(regAddress)) { return SpecialEcsAccess(true, pciAddress, regAddress, &value); } return WritePciConfigDwordEx(pciAddress, regAddress, value); }