Skip to content

Research nVidia's NVAPI I2C interface

I have an AORUS Xtreme GTX1080Ti "Waterforce WB" card in my PC and it has a plexi waterblock that is fully illuminated by one single-zone RGB strip. The AORUS software that comes with it is garbage, but it's the only thing capable of changing the colors.

I've tried some basic reverse engineering techniques on it and am fairly certain it is also interfaced via I2C. While it's outside the scope of "Aura", it falls in line with our I2C research and I'm also guessing Asus GPUs use the actual Aura chip on the NVAPI I2C interface, so we probably want NVAPI to support those.

From what I have gathered, NVAPI is a bit obfuscated and a lot of functionality is undocumented/behind NDA. There are some I2C functions with public documentation, but I'm not sure if these will work. Stepping through the AORUS program/GvDisplay.dll in API Monitor shows a lot of calls to nvapi_QueryInterface, which returns function pointers to the functions represented by unique hex codes. I've managed to gather that:

NvAPI_I2CWriteEx is 0x283AC65A

NvAPI_I2CReadEx is 0x4D7B0709

There is also a function within GvDisplay.dll called GvWriteI2C and it is called 4 times when setting a static color.

Unfortunately, I haven't been able to figure out much more than that. I'm guessing GvWriteI2C is a wrapper of sorts for NvAPI_I2CWriteEx but all I can see are stack values and I'm not sure how to turn those into arguments, pointers, structures, etc.

https://docs.nvidia.com/gameworks/content/gameworkslibrary/coresdk/nvapi/structNV__I2C__INFO__V3.html

https://docs.nvidia.com/gameworks/content/gameworkslibrary/coresdk/nvapi/group__i2capi.html

Edited by Adam Honse