Exemple #1
0
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);
}