BOOLEAN InfGetData(PINFCONTEXT Context, PWCHAR *Key, PWCHAR *Data) { return INF_SUCCESS(InfpGetData(Context, Key, Data)); }
BOOLEAN InfFindNextMatchLine(PINFCONTEXT ContextIn, PCWSTR Key, PINFCONTEXT ContextOut) { return INF_SUCCESS(InfpFindNextMatchLine(ContextIn, Key, ContextOut)); }
BOOLEAN InfGetDataField (PINFCONTEXT Context, ULONG FieldIndex, PWCHAR *Data) { return INF_SUCCESS(InfpGetDataField(Context, FieldIndex, Data)); }
BOOLEAN InfGetIntField(PINFCONTEXT Context, ULONG FieldIndex, PINT IntegerValue) { return INF_SUCCESS(InfpGetIntField(Context, FieldIndex, IntegerValue)); }
NTSTATUS InfOpenBufferedFile(PHINF InfHandle, PVOID Buffer, ULONG BufferSize, PULONG ErrorLine) { INFSTATUS Status; PINFCACHE Cache; PCHAR FileBuffer; CheckHeap(); *InfHandle = NULL; *ErrorLine = (ULONG)-1; /* Allocate file buffer */ FileBuffer = MALLOC(BufferSize + 1); if (FileBuffer == NULL) { DPRINT1("MALLOC() failed\n"); return(INF_STATUS_INSUFFICIENT_RESOURCES); } MEMCPY(FileBuffer, Buffer, BufferSize); /* Append string terminator */ FileBuffer[BufferSize] = 0; /* Allocate infcache header */ Cache = (PINFCACHE)MALLOC(sizeof(INFCACHE)); if (Cache == NULL) { DPRINT("MALLOC() failed\n"); FREE(FileBuffer); return(INF_STATUS_INSUFFICIENT_RESOURCES); } /* Initialize inicache header */ ZEROMEMORY(Cache, sizeof(INFCACHE)); /* Parse the inf buffer */ Status = InfpParseBuffer (Cache, FileBuffer, FileBuffer + BufferSize, ErrorLine); if (!INF_SUCCESS(Status)) { FREE(Cache); Cache = NULL; } /* Free file buffer */ FREE(FileBuffer); *InfHandle = (HINF)Cache; return(Status); }
BOOLEAN InfFindFirstLine(HINF InfHandle, PCWSTR Section, PCWSTR Key, PINFCONTEXT *Context) { return INF_SUCCESS(InfpFindFirstLine(InfHandle, Section, Key, Context)); }
BOOLEAN InfFindOrAddSection(HINF InfHandle, PCWSTR Section, PINFCONTEXT *Context) { return INF_SUCCESS(InfpFindOrAddSection((PINFCACHE) InfHandle, Section, Context)); }
BOOLEAN InfGetMultiSzField(PINFCONTEXT Context, ULONG FieldIndex, PWSTR ReturnBuffer, ULONG ReturnBufferSize, PULONG RequiredSize) { return INF_SUCCESS(InfpGetMultiSzField(Context, FieldIndex, ReturnBuffer, ReturnBufferSize, RequiredSize)); }
int InfHostAddField(PINFCONTEXT Context, const WCHAR *Data) { INFSTATUS Status; Status = InfpAddField(Context, Data); if (INF_SUCCESS(Status)) { return 0; } else { errno = Status; return -1; } }
int InfHostAddLine(PINFCONTEXT Context, const WCHAR *Key) { INFSTATUS Status; Status = InfpAddLineWithKey(Context, Key); if (INF_SUCCESS(Status)) { return 0; } else { errno = Status; return -1; } }
int InfHostWriteFile(HINF InfHandle, const CHAR *FileName, const CHAR *HeaderComment) { WCHAR *Buffer; ULONG BufferSize; INFSTATUS Status; FILE *File; Status = InfpBuildFileBuffer((PINFCACHE) InfHandle, &Buffer, &BufferSize); if (! INF_SUCCESS(Status)) { errno = Status; return -1; } File = fopen(FileName, "wb"); if (NULL == File) { FREE(Buffer); DPRINT1("fopen() failed (errno %d)\n", errno); return -1; } DPRINT("fopen() successful\n"); if (NULL != HeaderComment && '\0' != *HeaderComment) { // fprintf(File, "; %s\r\n\r\n", HeaderComment); } if (BufferSize != fwrite(Buffer, (size_t)1, (size_t)BufferSize, File)) { DPRINT1("fwrite() failed (errno %d)\n", errno); fclose(File); FREE(Buffer); return -1; } fclose(File); FREE(Buffer); return 0; }
int InfHostFindNextLine(PINFCONTEXT ContextIn, PINFCONTEXT ContextOut) { INFSTATUS Status; Status = InfpFindNextLine(ContextIn, ContextOut); if (INF_SUCCESS(Status)) { return 0; } else { errno = Status; return -1; } }
int InfHostFindOrAddSection(HINF InfHandle, const WCHAR *Section, PINFCONTEXT *Context) { INFSTATUS Status; Status = InfpFindOrAddSection((PINFCACHE) InfHandle, Section, Context); if (INF_SUCCESS(Status)) { return 0; } else { errno = Status; return -1; } }
int InfHostFindNextMatchLine(PINFCONTEXT ContextIn, const WCHAR *Key, PINFCONTEXT ContextOut) { INFSTATUS Status; Status = InfpFindNextMatchLine(ContextIn, Key, ContextOut); if (INF_SUCCESS(Status)) { return 0; } else { errno = Status; return -1; } }
int InfHostGetDataField(PINFCONTEXT Context, ULONG FieldIndex, WCHAR **Data) { INFSTATUS Status; Status = InfpGetDataField(Context, FieldIndex, Data); if (INF_SUCCESS(Status)) { return 0; } else { errno = Status; return -1; } }
int InfHostGetData(PINFCONTEXT Context, WCHAR **Key, WCHAR **Data) { INFSTATUS Status; Status = InfpGetData(Context, Key, Data); if (INF_SUCCESS(Status)) { return 0; } else { errno = Status; return -1; } }
int InfHostGetIntField(PINFCONTEXT Context, ULONG FieldIndex, INT *IntegerValue) { INFSTATUS Status; Status = InfpGetIntField(Context, FieldIndex, IntegerValue); if (INF_SUCCESS(Status)) { return 0; } else { errno = Status; return -1; } }
int InfHostFindFirstLine(HINF InfHandle, const WCHAR *Section, const WCHAR *Key, PINFCONTEXT *Context) { INFSTATUS Status; Status = InfpFindFirstLine(InfHandle, Section, Key, Context); if (INF_SUCCESS(Status)) { return 0; } else { errno = Status; return -1; } }
int InfHostGetStringField(PINFCONTEXT Context, ULONG FieldIndex, WCHAR *ReturnBuffer, ULONG ReturnBufferSize, ULONG *RequiredSize) { INFSTATUS Status; Status = InfpGetStringField(Context, FieldIndex, ReturnBuffer, ReturnBufferSize, RequiredSize); if (INF_SUCCESS(Status)) { return 0; } else { errno = Status; return -1; } }
BOOLEAN InfHostAddLine(PINFCONTEXT Context, PCWSTR Key) { return INF_SUCCESS(InfpAddLineWithKey(Context, Key)); }
NTSTATUS InfOpenFile(PHINF InfHandle, PUNICODE_STRING FileName, LANGID LanguageId, PULONG ErrorLine) { OBJECT_ATTRIBUTES ObjectAttributes; FILE_STANDARD_INFORMATION FileInfo; IO_STATUS_BLOCK IoStatusBlock; HANDLE FileHandle; NTSTATUS Status; PCHAR FileBuffer; ULONG FileLength; ULONG FileBufferLength; LARGE_INTEGER FileOffset; PINFCACHE Cache; CheckHeap(); *InfHandle = NULL; *ErrorLine = (ULONG)-1; /* Open the inf file */ InitializeObjectAttributes(&ObjectAttributes, FileName, 0, NULL, NULL); Status = NtOpenFile(&FileHandle, GENERIC_READ | SYNCHRONIZE, &ObjectAttributes, &IoStatusBlock, FILE_SHARE_READ, FILE_SYNCHRONOUS_IO_NONALERT | FILE_NON_DIRECTORY_FILE); if (!INF_SUCCESS(Status)) { DPRINT("NtOpenFile() failed (Status %lx)\n", Status); return(Status); } DPRINT("NtOpenFile() successful\n"); /* Query file size */ Status = NtQueryInformationFile(FileHandle, &IoStatusBlock, &FileInfo, sizeof(FILE_STANDARD_INFORMATION), FileStandardInformation); if (!INF_SUCCESS(Status)) { DPRINT("NtQueryInformationFile() failed (Status %lx)\n", Status); NtClose(FileHandle); return(Status); } FileLength = FileInfo.EndOfFile.u.LowPart; DPRINT("File size: %lu\n", FileLength); /* Allocate file buffer */ FileBufferLength = FileLength + 2; FileBuffer = MALLOC(FileBufferLength); if (FileBuffer == NULL) { DPRINT1("MALLOC() failed\n"); NtClose(FileHandle); return(INF_STATUS_INSUFFICIENT_RESOURCES); } /* Read file */ FileOffset.QuadPart = 0ULL; Status = NtReadFile(FileHandle, NULL, NULL, NULL, &IoStatusBlock, FileBuffer, FileLength, &FileOffset, NULL); /* Append string terminator */ FileBuffer[FileLength] = 0; FileBuffer[FileLength + 1] = 0; NtClose(FileHandle); if (!INF_SUCCESS(Status)) { DPRINT("NtReadFile() failed (Status %lx)\n", Status); FREE(FileBuffer); return(Status); } /* Allocate infcache header */ Cache = (PINFCACHE)MALLOC(sizeof(INFCACHE)); if (Cache == NULL) { DPRINT("MALLOC() failed\n"); FREE(FileBuffer); return(INF_STATUS_INSUFFICIENT_RESOURCES); } /* Initialize inicache header */ ZEROMEMORY(Cache, sizeof(INFCACHE)); Cache->LanguageId = LanguageId; /* Parse the inf buffer */ if (!RtlIsTextUnicode(FileBuffer, FileBufferLength, NULL)) { // static const BYTE utf8_bom[3] = { 0xef, 0xbb, 0xbf }; WCHAR *new_buff; // UINT codepage = CP_ACP; UINT offset = 0; // if (FileLength > sizeof(utf8_bom) && !memcmp(FileBuffer, utf8_bom, sizeof(utf8_bom) )) // { // codepage = CP_UTF8; // offset = sizeof(utf8_bom); // } new_buff = MALLOC(FileBufferLength * sizeof(WCHAR)); if (new_buff != NULL) { ULONG len; Status = RtlMultiByteToUnicodeN(new_buff, FileBufferLength * sizeof(WCHAR), &len, (char *)FileBuffer + offset, FileBufferLength - offset); Status = InfpParseBuffer(Cache, new_buff, new_buff + len / sizeof(WCHAR), ErrorLine); FREE(new_buff); } else Status = INF_STATUS_INSUFFICIENT_RESOURCES; } else { WCHAR *new_buff = (WCHAR *)FileBuffer; /* UCS-16 files should start with the Unicode BOM; we should skip it */ if (*new_buff == 0xfeff) { new_buff++; FileBufferLength -= sizeof(WCHAR); } Status = InfpParseBuffer(Cache, new_buff, (WCHAR*)((char*)new_buff + FileBufferLength), ErrorLine); } if (!INF_SUCCESS(Status)) { FREE(Cache); Cache = NULL; } /* Free file buffer */ FREE(FileBuffer); *InfHandle = (HINF)Cache; return(Status); }
BOOLEAN InfFindNextLine(PINFCONTEXT ContextIn, PINFCONTEXT ContextOut) { return INF_SUCCESS(InfpFindNextLine(ContextIn, ContextOut)); }
int InfHostOpenFile(PHINF InfHandle, const CHAR *FileName, LANGID LanguageId, ULONG *ErrorLine) { FILE *File; CHAR *FileBuffer; ULONG FileLength; ULONG FileBufferLength; PINFCACHE Cache; INFSTATUS Status = INF_STATUS_SUCCESS; *InfHandle = NULL; *ErrorLine = (ULONG)-1; /* Open the inf file */ File = fopen(FileName, "rb"); if (NULL == File) { DPRINT1("fopen() failed (errno %d)\n", errno); return -1; } DPRINT("fopen() successful\n"); /* Query file size */ if (fseek(File, (size_t)0, SEEK_END)) { DPRINT1("fseek() to EOF failed (errno %d)\n", errno); fclose(File); return -1; } FileLength = (ULONG)ftell(File); if ((ULONG) -1 == FileLength) { DPRINT1("ftell() failed (errno %d)\n", errno); fclose(File); return -1; } DPRINT("File size: %u\n", (UINT)FileLength); /* Rewind */ if (fseek(File, (size_t)0, SEEK_SET)) { DPRINT1("fseek() to BOF failed (errno %d)\n", errno); fclose(File); return -1; } /* Allocate file buffer */ FileBufferLength = FileLength + 2; FileBuffer = MALLOC(FileBufferLength); if (FileBuffer == NULL) { DPRINT1("MALLOC() failed\n"); fclose(File); return -1; } /* Read file */ if (FileLength != fread(FileBuffer, (size_t)1, (size_t)FileLength, File)) { DPRINT1("fread() failed (errno %d)\n", errno); FREE(FileBuffer); fclose(File); return -1; } fclose(File); /* Append string terminator */ FileBuffer[FileLength] = 0; FileBuffer[FileLength + 1] = 0; /* Allocate infcache header */ Cache = (PINFCACHE)MALLOC(sizeof(INFCACHE)); if (Cache == NULL) { DPRINT1("MALLOC() failed\n"); FREE(FileBuffer); return -1; } /* Initialize inicache header */ ZEROMEMORY(Cache, sizeof(INFCACHE)); Cache->LanguageId = LanguageId; /* Parse the inf buffer */ if (!RtlIsTextUnicode(FileBuffer, (INT)FileBufferLength, NULL)) { // static const BYTE utf8_bom[3] = { 0xef, 0xbb, 0xbf }; WCHAR *new_buff; // UINT codepage = CP_ACP; UINT offset = 0; // if (FileLength > sizeof(utf8_bom) && !memcmp(FileBuffer, utf8_bom, sizeof(utf8_bom) )) // { // codepage = CP_UTF8; // offset = sizeof(utf8_bom); // } new_buff = MALLOC(FileBufferLength * sizeof(WCHAR)); if (new_buff != NULL) { ULONG len; Status = RtlMultiByteToUnicodeN(new_buff, FileBufferLength * sizeof(WCHAR), &len, (char *)FileBuffer + offset, FileBufferLength - offset); Status = InfpParseBuffer(Cache, new_buff, new_buff + len / sizeof(WCHAR), ErrorLine); FREE(new_buff); } else Status = INF_STATUS_INSUFFICIENT_RESOURCES; } else { WCHAR *new_buff = (WCHAR *)FileBuffer; /* UCS-16 files should start with the Unicode BOM; we should skip it */ if (*new_buff == 0xfeff) { new_buff++; FileBufferLength -= sizeof(WCHAR); } Status = InfpParseBuffer(Cache, new_buff, (WCHAR*)((char*)new_buff + FileBufferLength), ErrorLine); } if (!INF_SUCCESS(Status)) { FREE(Cache); Cache = NULL; } /* Free file buffer */ FREE(FileBuffer); *InfHandle = (HINF)Cache; return INF_SUCCESS(Status) ? 0 : -1; }
NTSTATUS InfWriteFile(HINF InfHandle, PUNICODE_STRING FileName, PUNICODE_STRING HeaderComment) { OBJECT_ATTRIBUTES ObjectAttributes; IO_STATUS_BLOCK IoStatusBlock; HANDLE FileHandle; NTSTATUS Status; INFSTATUS InfStatus; PWCHAR Buffer; ULONG BufferSize; PWCHAR HeaderBuffer; ULONG HeaderBufferSize; UINT Index; InfStatus = InfpBuildFileBuffer((PINFCACHE) InfHandle, &Buffer, &BufferSize); if (! INF_SUCCESS(InfStatus)) { DPRINT("Failed to create buffer (Status 0x%lx)\n", InfStatus); return InfStatus; } /* Open the inf file */ InitializeObjectAttributes(&ObjectAttributes, FileName, 0, NULL, NULL); Status = NtOpenFile(&FileHandle, GENERIC_WRITE | SYNCHRONIZE, &ObjectAttributes, &IoStatusBlock, 0, FILE_SYNCHRONOUS_IO_NONALERT | FILE_NON_DIRECTORY_FILE); if (!INF_SUCCESS(Status)) { DPRINT1("NtOpenFile() failed (Status %lx)\n", Status); FREE(Buffer); return Status; } DPRINT("NtOpenFile() successful\n"); if (NULL != HeaderComment && 0 != HeaderComment->Length) { /* This is just a comment header, don't abort on errors here */ HeaderBufferSize = HeaderComment->Length + 7 * sizeof(WCHAR); HeaderBuffer = MALLOC(HeaderBufferSize); if (NULL != HeaderBuffer) { strcpyW(HeaderBuffer, L"; "); for (Index = 0; Index < HeaderComment->Length / sizeof(WCHAR); Index++) { HeaderBuffer[2 + Index] = HeaderComment->Buffer[Index]; } strcpyW(HeaderBuffer + (2 + HeaderComment->Length / sizeof(WCHAR)), L"\r\n\r\n"); NtWriteFile(FileHandle, NULL, NULL, NULL, &IoStatusBlock, HeaderBuffer, HeaderBufferSize, NULL, NULL); FREE(HeaderBuffer); } } /* Write main contents */ Status = NtWriteFile(FileHandle, NULL, NULL, NULL, &IoStatusBlock, Buffer, BufferSize, NULL, NULL); NtClose(FileHandle); FREE(Buffer); if (!INF_SUCCESS(Status)) { DPRINT1("NtWriteFile() failed (Status %lx)\n", Status); FREE(Buffer); return(Status); } return STATUS_SUCCESS; }
INFSTATUS InfpBuildFileBuffer(PINFCACHE Cache, PWCHAR *Buffer, PULONG BufferSize) { OUTPUTBUFFER OutBuf; PINFCACHESECTION CacheSection; PINFCACHELINE CacheLine; PINFCACHEFIELD CacheField; PWCHAR p; BOOLEAN NeedQuotes; OutBuf.Buffer = NULL; OutBuf.Current = NULL; OutBuf.FreeSize = 0; OutBuf.TotalSize = 0; OutBuf.Status = INF_STATUS_SUCCESS; /* Iterate through list of sections */ CacheSection = Cache->FirstSection; while (CacheSection != NULL) { DPRINT("Processing section %S\n", CacheSection->Name); if (CacheSection != Cache->FirstSection) { Output(&OutBuf, EOL); } Output(&OutBuf, L"["); Output(&OutBuf, CacheSection->Name); Output(&OutBuf, L"]"); Output(&OutBuf, EOL); /* Iterate through list of lines */ CacheLine = CacheSection->FirstLine; while (CacheLine != NULL) { if (NULL != CacheLine->Key) { DPRINT("Line with key %S\n", CacheLine->Key); Output(&OutBuf, CacheLine->Key); Output(&OutBuf, L" = "); } else { DPRINT("Line without key\n"); } /* Iterate through list of lines */ CacheField = CacheLine->FirstField; while (CacheField != NULL) { if (CacheField != CacheLine->FirstField) { Output(&OutBuf, L","); } p = CacheField->Data; NeedQuotes = FALSE; while (L'\0' != *p && ! NeedQuotes) { NeedQuotes = (BOOLEAN)(L',' == *p || L';' == *p || L'\\' == *p); p++; } if (NeedQuotes) { Output(&OutBuf, L"\""); Output(&OutBuf, CacheField->Data); Output(&OutBuf, L"\""); } else { Output(&OutBuf, CacheField->Data); } /* Get the next field */ CacheField = CacheField->Next; } Output(&OutBuf, EOL); /* Get the next line */ CacheLine = CacheLine->Next; } /* Get the next section */ CacheSection = CacheSection->Next; } if (INF_SUCCESS(OutBuf.Status)) { *Buffer = OutBuf.Buffer; *BufferSize = OutBuf.TotalSize - OutBuf.FreeSize; } else if (NULL != OutBuf.Buffer) { FREE(OutBuf.Buffer); } return INF_STATUS_SUCCESS; }
static void Output(POUTPUTBUFFER OutBuf, PCWSTR Text) { ULONG Length; PWCHAR NewBuf; ULONG NewSize; /* Skip mode? */ if (! INF_SUCCESS(OutBuf->Status)) { return; } /* Doesn't fit? */ Length = (ULONG)strlenW(Text) * sizeof(WCHAR); if (OutBuf->FreeSize < Length + 1 && INF_SUCCESS(OutBuf->Status)) { DPRINT("Out of free space. TotalSize %u FreeSize %u Length %u\n", (UINT)OutBuf->TotalSize, (UINT)OutBuf->FreeSize, (UINT)Length); /* Round up to next SIZE_INC */ NewSize = OutBuf->TotalSize + (((Length + 1) - OutBuf->FreeSize + (SIZE_INC - 1)) / SIZE_INC) * SIZE_INC; DPRINT("NewSize %u\n", (UINT)NewSize); NewBuf = MALLOC(NewSize); /* Abort if failed */ if (NULL == NewBuf) { DPRINT1("MALLOC() failed\n"); OutBuf->Status = INF_STATUS_NO_MEMORY; return; } /* Need to copy old contents? */ if (NULL != OutBuf->Buffer) { DPRINT("Copying %u bytes from old content\n", (UINT)(OutBuf->TotalSize - OutBuf->FreeSize)); MEMCPY(NewBuf, OutBuf->Buffer, OutBuf->TotalSize - OutBuf->FreeSize); OutBuf->Current = NewBuf + (OutBuf->Current - OutBuf->Buffer); FREE(OutBuf->Buffer); } else { OutBuf->Current = NewBuf; } OutBuf->Buffer = NewBuf; OutBuf->FreeSize += NewSize - OutBuf->TotalSize; OutBuf->TotalSize = NewSize; DPRINT("After reallocation TotalSize %u FreeSize %u\n", (UINT)OutBuf->TotalSize, (UINT)OutBuf->FreeSize); } /* We're guaranteed to have enough room now. Copy char by char because of possible "conversion" from Unicode to Ansi */ while (Length--) { *OutBuf->Current++ = *Text++; OutBuf->FreeSize--; } *OutBuf->Current = '\0'; }
NTSTATUS InfOpenFile(PHINF InfHandle, PUNICODE_STRING FileName, PULONG ErrorLine) { OBJECT_ATTRIBUTES ObjectAttributes; FILE_STANDARD_INFORMATION FileInfo; IO_STATUS_BLOCK IoStatusBlock; HANDLE FileHandle; NTSTATUS Status; PCHAR FileBuffer; ULONG FileLength; LARGE_INTEGER FileOffset; PINFCACHE Cache; CheckHeap(); *InfHandle = NULL; *ErrorLine = (ULONG)-1; /* Open the inf file */ InitializeObjectAttributes(&ObjectAttributes, FileName, 0, NULL, NULL); Status = NtOpenFile(&FileHandle, GENERIC_READ | SYNCHRONIZE, &ObjectAttributes, &IoStatusBlock, FILE_SHARE_READ, FILE_SYNCHRONOUS_IO_NONALERT | FILE_NON_DIRECTORY_FILE); if (!INF_SUCCESS(Status)) { DPRINT("NtOpenFile() failed (Status %lx)\n", Status); return(Status); } DPRINT("NtOpenFile() successful\n"); /* Query file size */ Status = NtQueryInformationFile(FileHandle, &IoStatusBlock, &FileInfo, sizeof(FILE_STANDARD_INFORMATION), FileStandardInformation); if (!INF_SUCCESS(Status)) { DPRINT("NtQueryInformationFile() failed (Status %lx)\n", Status); NtClose(FileHandle); return(Status); } FileLength = FileInfo.EndOfFile.u.LowPart; DPRINT("File size: %lu\n", FileLength); /* Allocate file buffer */ FileBuffer = MALLOC(FileLength + 1); if (FileBuffer == NULL) { DPRINT1("MALLOC() failed\n"); NtClose(FileHandle); return(INF_STATUS_INSUFFICIENT_RESOURCES); } /* Read file */ FileOffset.QuadPart = 0ULL; Status = NtReadFile(FileHandle, NULL, NULL, NULL, &IoStatusBlock, FileBuffer, FileLength, &FileOffset, NULL); /* Append string terminator */ FileBuffer[FileLength] = 0; NtClose(FileHandle); if (!INF_SUCCESS(Status)) { DPRINT("NtReadFile() failed (Status %lx)\n", Status); FREE(FileBuffer); return(Status); } /* Allocate infcache header */ Cache = (PINFCACHE)MALLOC(sizeof(INFCACHE)); if (Cache == NULL) { DPRINT("MALLOC() failed\n"); FREE(FileBuffer); return(INF_STATUS_INSUFFICIENT_RESOURCES); } /* Initialize inicache header */ ZEROMEMORY(Cache, sizeof(INFCACHE)); /* Parse the inf buffer */ Status = InfpParseBuffer (Cache, FileBuffer, FileBuffer + FileLength, ErrorLine); if (!INF_SUCCESS(Status)) { FREE(Cache); Cache = NULL; } /* Free file buffer */ FREE(FileBuffer); *InfHandle = (HINF)Cache; return(Status); }
int InfHostOpenBufferedFile(PHINF InfHandle, void *Buffer, ULONG BufferSize, LANGID LanguageId, ULONG *ErrorLine) { INFSTATUS Status; PINFCACHE Cache; WCHAR *FileBuffer; ULONG FileBufferSize; *InfHandle = NULL; *ErrorLine = (ULONG)-1; /* Allocate file buffer */ FileBufferSize = BufferSize + 2; FileBuffer = MALLOC(FileBufferSize); if (FileBuffer == NULL) { DPRINT1("MALLOC() failed\n"); return(INF_STATUS_INSUFFICIENT_RESOURCES); } MEMCPY(FileBuffer, Buffer, BufferSize); /* Append string terminator */ FileBuffer[BufferSize] = 0; FileBuffer[BufferSize + 1] = 0; /* Allocate infcache header */ Cache = (PINFCACHE)MALLOC(sizeof(INFCACHE)); if (Cache == NULL) { DPRINT1("MALLOC() failed\n"); FREE(FileBuffer); return(INF_STATUS_INSUFFICIENT_RESOURCES); } /* Initialize inicache header */ ZEROMEMORY(Cache, sizeof(INFCACHE)); Cache->LanguageId = LanguageId; /* Parse the inf buffer */ if (!RtlIsTextUnicode(FileBuffer, (INT)FileBufferSize, NULL)) { // static const BYTE utf8_bom[3] = { 0xef, 0xbb, 0xbf }; WCHAR *new_buff; // UINT codepage = CP_ACP; UINT offset = 0; // if (BufferSize > sizeof(utf8_bom) && !memcmp(FileBuffer, utf8_bom, sizeof(utf8_bom) )) // { // codepage = CP_UTF8; // offset = sizeof(utf8_bom); // } new_buff = MALLOC(FileBufferSize * sizeof(WCHAR)); if (new_buff != NULL) { ULONG len; Status = RtlMultiByteToUnicodeN(new_buff, FileBufferSize * sizeof(WCHAR), &len, (char *)FileBuffer + offset, FileBufferSize - offset); Status = InfpParseBuffer(Cache, new_buff, new_buff + len / sizeof(WCHAR), ErrorLine); FREE(new_buff); } else Status = INF_STATUS_INSUFFICIENT_RESOURCES; } else { WCHAR *new_buff = (WCHAR *)FileBuffer; /* UCS-16 files should start with the Unicode BOM; we should skip it */ if (*new_buff == 0xfeff) { new_buff++; FileBufferSize -= sizeof(WCHAR); } Status = InfpParseBuffer(Cache, new_buff, (WCHAR*)((char*)new_buff + FileBufferSize), ErrorLine); } if (!INF_SUCCESS(Status)) { FREE(Cache); Cache = NULL; } /* Free file buffer */ FREE(FileBuffer); *InfHandle = (HINF)Cache; return INF_SUCCESS(Status) ? 0 : -1; }
BOOLEAN InfHostAddField(PINFCONTEXT Context, PCWSTR Data) { return INF_SUCCESS(InfpAddField(Context, Data)); }