The documentation of the PowerReadFriendlyName() function does not mention that the variable holding the length of the buffer gets overwritten in a successful call with a non-NULL buffer. It has therefore be set before each call of PowerReadFriendlyName() or it can fail:
UCHAR displayBuffer[2048];
DWORD displayBufferSize;
GUID buffer;
DWORD bufferSize = sizeof(buffer);
int index;
int fail=0,ok=0;
//
for(index = 0 ; ; index++)
{ ZeroMemory(&buffer, sizeof(buffer));
ZeroMemory(&displayBuffer, sizeof(displayBuffer));
if (PowerEnumerate(NULL,NULL,NULL, ACCESS_SCHEME,index,(UCHAR*)&buffer,&bufferSize) == ERROR_SUCCESS)
{ displayBufferSize = sizeof(displayBuffer);
if (PowerReadFriendlyName(NULL, &buffer,&NO_SUBGROUP_GUID,NULL,displayBuffer,&displayBufferSize) == ERROR_SUCCESS)
{ ok++;
// stuff to todo
}
else
{ fail++;
}
}
else
{ break;
}
}