+ UNICODE_STRING SectionW, FileNameW;
+ LPWSTR BufferW;
+ INT RetW, Ret = 0;
+
+ BufferW = NULL != Buffer ? HeapAlloc(GetProcessHeap(), 0, Len * sizeof(WCHAR)) : NULL;
+ if (NULL != Section)
+ {
+ RtlCreateUnicodeStringFromAsciiz(&SectionW, Section);
+ }
+ else
+ {
+ SectionW.Buffer = NULL;
+ }
+ if (NULL != FileName)
+ {
+ RtlCreateUnicodeStringFromAsciiz(&FileNameW, FileName);
+ }
+ else
+ {
+ FileNameW.Buffer = NULL;
+ }
+
+ RetW = GetPrivateProfileSectionW(SectionW.Buffer, BufferW, Len, FileNameW.Buffer);
+
+ if (2 < Len)
+ {
+ Ret = WideCharToMultiByte(CP_ACP, 0, BufferW, RetW + 2, Buffer, Len, NULL, NULL);
+ if (2 < Ret)
+ {
+ Ret -= 2;
+ }
+ else
+ {
+ Ret = 0;
+ Buffer[Len-2] = '\0';
+ Buffer[Len-1] = '\0';
+ }
+ }
+ else
+ {
+ Buffer[0] = '\0';
+ Buffer[1] = '\0';
+ }
+
+ RtlFreeUnicodeString(&SectionW);
+ RtlFreeUnicodeString(&FileNameW);
+ if (NULL != BufferW)
+ {
+ HeapFree(GetProcessHeap(), 0, BufferW);
+ }
+
+ return Ret;