The problem is passing 'dd' to the internal call when using the 'dd' member as input string. I know this doesn't make sense, but I suspect that since dd is the out parameter that the API writes, but then looks at the contents of the input parameter after it has scratched it. This can happen if they did something like memset'ing the output parm to 0 before executing for reasonableness.
Just make sure that this is not something to send to a non-empty dd, I made a second dd with the same bits in it, and everything still works fine. This is definitely an alias memory.
#include <windows.h> #include <stdio.h> #pragma comment(lib, "user32.lib") void DumpDevice(const DISPLAY_DEVICE& dd, size_t nSpaceCount ) { printf("%*sDevice Name: %s\n", nSpaceCount, "", dd.DeviceName ); printf("%*sDevice String: %s\n", nSpaceCount, "", dd.DeviceString ); printf("%*sState Flags: %x\n", nSpaceCount, "", dd.StateFlags ); printf("%*sDeviceID: %s\n", nSpaceCount, "", dd.DeviceID ); printf("%*sDeviceKey: ...%s\n\n", nSpaceCount, "", dd.DeviceKey+42 ); } int main() { DISPLAY_DEVICE dd; dd.cb = sizeof(DISPLAY_DEVICE); DWORD deviceNum = 0; while( EnumDisplayDevices(NULL, deviceNum, &dd, 0) ){ DumpDevice( dd, 0 ); DISPLAY_DEVICE newdd = {0}; newdd.cb = sizeof(DISPLAY_DEVICE); DWORD monitorNum = 0; while ( EnumDisplayDevices(dd.DeviceName, monitorNum, &newdd, 0)) { DumpDevice( newdd, 4 ); monitorNum++; } puts(""); deviceNum++; } return 0; }
There is only 1 monitor in the box now, so I canβt check the inner loop, but I suspect this is good, since "newdd" never gets aliases in the call. You also say that you are in the context of a service β I'm not sure that this winstation will limit what you see on the displays β so that could also be a problem; but I suspect that you can still at least see the physical device. On my machine, I get:
Device Name: \\.\DISPLAY1 Device String: NVIDIA GeForce GTX 580 State Flags: 8000005 DeviceID: PCI\VEN_10DE&DEV_1080&SUBSYS_15803842&REV_A1 DeviceKey: ...\Control\Video\{B0CDD262-FCFB-4FD4-A03C-54621896C9CD}\0000 Device Name: \\.\DISPLAY1\Monitor0 Device String: Generic PnP Monitor State Flags: 3 DeviceID: MONITOR\DEL4016\{4d36e96e-e325-11ce-bfc1-08002be10318}\0002 DeviceKey: ...\Control\Class\{4d36e96e-e325-11ce-bfc1-08002be10318}\0002 Device Name: \\.\DISPLAY2 Device String: NVIDIA GeForce GTX 580 State Flags: 0 DeviceID: PCI\VEN_10DE&DEV_1080&SUBSYS_15803842&REV_A1 DeviceKey: ...\Control\Video\{B0CDD262-FCFB-4FD4-A03C-54621896C9CD}\0001 Device Name: \\.\DISPLAYV1 Device String: RDPDD Chained DD State Flags: 8 DeviceID: DeviceKey: ...\Control\Video\{DEB039CC-B704-4F53-B43E-9DD4432FA2E9}\0000 Device Name: \\.\DISPLAYV2 Device String: RDP Encoder Mirror Driver State Flags: 200008 DeviceID: DeviceKey: ...\Control\Video\{42cf9257-1d96-4c9d-87f3-0d8e74595f78}\0000 Device Name: \\.\DISPLAYV3 Device String: RDP Reflector Display Driver State Flags: 200008 DeviceID: DeviceKey: ...\Control\Video\{b043b95c-5670-4f10-b934-8ed0c8eb59a8}\0000