ReactOS  0.4.14-dev-608-gd495a4f
inicache.h File Reference
This graph shows which files directly or indirectly include this file:

Go to the source code of this file.

Classes

struct  _INICACHEKEY
 
struct  _INICACHESECTION
 
struct  _INICACHE
 
struct  _PINICACHEITERATOR
 

Typedefs

typedef struct _INICACHEKEY INICACHEKEY
 
typedef struct _INICACHEKEYPINICACHEKEY
 
typedef struct _INICACHESECTION INICACHESECTION
 
typedef struct _INICACHESECTIONPINICACHESECTION
 
typedef struct _INICACHE INICACHE
 
typedef struct _INICACHEPINICACHE
 
typedef struct _PINICACHEITERATOR INICACHEITERATOR
 
typedef struct _PINICACHEITERATORPINICACHEITERATOR
 

Enumerations

enum  INSERTION_TYPE { INSERT_FIRST, INSERT_BEFORE, INSERT_AFTER, INSERT_LAST }
 

Functions

NTSTATUS IniCacheLoadFromMemory (PINICACHE *Cache, PCHAR FileBuffer, ULONG FileLength, BOOLEAN String)
 
NTSTATUS IniCacheLoadByHandle (PINICACHE *Cache, HANDLE FileHandle, BOOLEAN String)
 
NTSTATUS IniCacheLoad (PINICACHE *Cache, PWCHAR FileName, BOOLEAN String)
 
VOID IniCacheDestroy (PINICACHE Cache)
 
PINICACHESECTION IniCacheGetSection (PINICACHE Cache, PWCHAR Name)
 
NTSTATUS IniCacheGetKey (PINICACHESECTION Section, PWCHAR KeyName, PWCHAR *KeyData)
 
PINICACHEITERATOR IniCacheFindFirstValue (PINICACHESECTION Section, PWCHAR *KeyName, PWCHAR *KeyData)
 
BOOLEAN IniCacheFindNextValue (PINICACHEITERATOR Iterator, PWCHAR *KeyName, PWCHAR *KeyData)
 
VOID IniCacheFindClose (PINICACHEITERATOR Iterator)
 
PINICACHEKEY IniCacheInsertKey (PINICACHESECTION Section, PINICACHEKEY AnchorKey, INSERTION_TYPE InsertionType, PWCHAR Name, PWCHAR Data)
 
PINICACHE IniCacheCreate (VOID)
 
NTSTATUS IniCacheSaveByHandle (PINICACHE Cache, HANDLE FileHandle)
 
NTSTATUS IniCacheSave (PINICACHE Cache, PWCHAR FileName)
 
PINICACHESECTION IniCacheAppendSection (PINICACHE Cache, PWCHAR Name)
 

Typedef Documentation

◆ INICACHE

◆ INICACHEITERATOR

◆ INICACHEKEY

◆ INICACHESECTION

◆ PINICACHE

◆ PINICACHEITERATOR

◆ PINICACHEKEY

◆ PINICACHESECTION

Enumeration Type Documentation

◆ INSERTION_TYPE

Enumerator
INSERT_FIRST 
INSERT_BEFORE 
INSERT_AFTER 
INSERT_LAST 

Definition at line 46 of file inicache.h.

Function Documentation

◆ IniCacheAppendSection()

PINICACHESECTION IniCacheAppendSection ( PINICACHE  Cache,
PWCHAR  Name 
)

Definition at line 1088 of file inicache.c.

1091 {
1092  PINICACHESECTION Section = NULL;
1093 
1094  if (Cache == NULL || Name == NULL || *Name == 0)
1095  {
1096  DPRINT("Invalid parameter\n");
1097  return NULL;
1098  }
1099 
1102  sizeof(INICACHESECTION));
1103  if (Section == NULL)
1104  {
1105  DPRINT("RtlAllocateHeap() failed\n");
1106  return NULL;
1107  }
1108 
1109  /* Allocate and initialize section name */
1110  Section->Name = (WCHAR*)RtlAllocateHeap(ProcessHeap,
1111  0,
1112  (wcslen(Name) + 1) * sizeof(WCHAR));
1113  if (Section->Name == NULL)
1114  {
1115  DPRINT("RtlAllocateHeap() failed\n");
1116  RtlFreeHeap(ProcessHeap, 0, Section);
1117  return NULL;
1118  }
1119 
1120  /* Copy section name */
1121  wcscpy(Section->Name, Name);
1122 
1123  /* Append section */
1124  if (Cache->FirstSection == NULL)
1125  {
1126  Cache->FirstSection = Section;
1127  Cache->LastSection = Section;
1128  }
1129  else
1130  {
1131  Cache->LastSection->Next = Section;
1132  Section->Prev = Cache->LastSection;
1133  Cache->LastSection = Section;
1134  }
1135 
1136  return Section;
1137 }
struct _INICACHESECTION * Prev
Definition: inicache.h:28
Definition: fatfs.h:173
BOOLEAN NTAPI RtlFreeHeap(IN PVOID HeapHandle, IN ULONG Flags, IN PVOID HeapBase)
Definition: heap.c:606
smooth NULL
Definition: ftsmooth.c:416
void DPRINT(...)
Definition: polytest.cpp:61
PVOID NTAPI RtlAllocateHeap(IN PVOID HeapHandle, IN ULONG Flags, IN SIZE_T Size)
Definition: heap.c:588
__wchar_t WCHAR
Definition: xmlstorage.h:180
_CRTIMP wchar_t *__cdecl wcscpy(_Out_writes_z_(_String_length_(_Source)+1) wchar_t *_Dest, _In_z_ const wchar_t *_Source)
HANDLE ProcessHeap
Definition: servman.c:15
#define HEAP_ZERO_MEMORY
Definition: compat.h:123
struct _INICACHESECTION * PINICACHESECTION
size_t __cdecl wcslen(_In_z_ const wchar_t *_Str)

Referenced by CreateCommonFreeLdrSections(), CreateNTOSEntry(), InstallSetupInfFile(), and OpenIniBootLoaderStore().

◆ IniCacheCreate()

PINICACHE IniCacheCreate ( VOID  )

Definition at line 929 of file inicache.c.

930 {
932 
933  /* Allocate inicache header */
936  sizeof(INICACHE));
937  if (Cache == NULL)
938  {
939  DPRINT("RtlAllocateHeap() failed\n");
940  return NULL;
941  }
942 
943  return Cache;
944 }
Definition: fatfs.h:173
smooth NULL
Definition: ftsmooth.c:416
void DPRINT(...)
Definition: polytest.cpp:61
PVOID NTAPI RtlAllocateHeap(IN PVOID HeapHandle, IN ULONG Flags, IN SIZE_T Size)
Definition: heap.c:588
HANDLE ProcessHeap
Definition: servman.c:15
#define HEAP_ZERO_MEMORY
Definition: compat.h:123
struct _INICACHE * PINICACHE

Referenced by InstallSetupInfFile(), and OpenIniBootLoaderStore().

◆ IniCacheDestroy()

VOID IniCacheDestroy ( PINICACHE  Cache)

Definition at line 666 of file inicache.c.

668 {
669  if (Cache == NULL)
670  return;
671 
672  while (Cache->FirstSection != NULL)
673  {
674  Cache->FirstSection = IniCacheFreeSection(Cache->FirstSection);
675  }
676  Cache->LastSection = NULL;
677 
679 }
Definition: fatfs.h:173
BOOLEAN NTAPI RtlFreeHeap(IN PVOID HeapHandle, IN ULONG Flags, IN PVOID HeapBase)
Definition: heap.c:606
smooth NULL
Definition: ftsmooth.c:416
static PINICACHESECTION IniCacheFreeSection(PINICACHESECTION Section)
Definition: inicache.c:50
HANDLE ProcessHeap
Definition: servman.c:15

Referenced by CloseIniBootLoaderStore(), InstallSetupInfFile(), and OpenIniBootLoaderStore().

◆ IniCacheFindClose()

VOID IniCacheFindClose ( PINICACHEITERATOR  Iterator)

Definition at line 815 of file inicache.c.

817 {
818  if (Iterator == NULL)
819  return;
820 
821  RtlFreeHeap(ProcessHeap, 0, Iterator);
822 }
BOOLEAN NTAPI RtlFreeHeap(IN PVOID HeapHandle, IN ULONG Flags, IN PVOID HeapBase)
Definition: heap.c:606
smooth NULL
Definition: ftsmooth.c:416
HANDLE ProcessHeap
Definition: servman.c:15

Referenced by FreeLdrEnumerateBootEntries(), and NtLdrEnumerateBootEntries().

◆ IniCacheFindFirstValue()

PINICACHEITERATOR IniCacheFindFirstValue ( PINICACHESECTION  Section,
PWCHAR KeyName,
PWCHAR KeyData 
)

Definition at line 744 of file inicache.c.

748 {
749  PINICACHEITERATOR Iterator;
751 
752  if (Section == NULL || KeyName == NULL || KeyData == NULL)
753  {
754  DPRINT("Invalid parameter\n");
755  return NULL;
756  }
757 
758  Key = Section->FirstKey;
759  if (Key == NULL)
760  {
761  DPRINT("Invalid parameter\n");
762  return NULL;
763  }
764 
765  *KeyName = Key->Name;
766  *KeyData = Key->Data;
767 
769  0,
770  sizeof(INICACHEITERATOR));
771  if (Iterator == NULL)
772  {
773  DPRINT("RtlAllocateHeap() failed\n");
774  return NULL;
775  }
776 
777  Iterator->Section = Section;
778  Iterator->Key = Key;
779 
780  return Iterator;
781 }
PINICACHEKEY FirstKey
Definition: inicache.h:24
_Must_inspect_result_ _Out_ PNDIS_STATUS _In_ NDIS_HANDLE _In_ ULONG _Out_ PNDIS_STRING KeyName
Definition: ndis.h:4711
IN PLARGE_INTEGER IN PLARGE_INTEGER PEPROCESS ULONG Key
Definition: fatprocs.h:2697
PINICACHESECTION Section
Definition: inicache.h:41
smooth NULL
Definition: ftsmooth.c:416
void DPRINT(...)
Definition: polytest.cpp:61
PVOID NTAPI RtlAllocateHeap(IN PVOID HeapHandle, IN ULONG Flags, IN SIZE_T Size)
Definition: heap.c:588
PINICACHEKEY Key
Definition: inicache.h:42
struct _PINICACHEITERATOR * PINICACHEITERATOR
HANDLE ProcessHeap
Definition: servman.c:15

Referenced by FreeLdrEnumerateBootEntries(), and NtLdrEnumerateBootEntries().

◆ IniCacheFindNextValue()

BOOLEAN IniCacheFindNextValue ( PINICACHEITERATOR  Iterator,
PWCHAR KeyName,
PWCHAR KeyData 
)

Definition at line 785 of file inicache.c.

789 {
791 
792  if (Iterator == NULL || KeyName == NULL || KeyData == NULL)
793  {
794  DPRINT("Invalid parameter\n");
795  return FALSE;
796  }
797 
798  Key = Iterator->Key->Next;
799  if (Key == NULL)
800  {
801  DPRINT("No more entries\n");
802  return FALSE;
803  }
804 
805  *KeyName = Key->Name;
806  *KeyData = Key->Data;
807 
808  Iterator->Key = Key;
809 
810  return TRUE;
811 }
_Must_inspect_result_ _Out_ PNDIS_STATUS _In_ NDIS_HANDLE _In_ ULONG _Out_ PNDIS_STRING KeyName
Definition: ndis.h:4711
#define TRUE
Definition: types.h:120
IN PLARGE_INTEGER IN PLARGE_INTEGER PEPROCESS ULONG Key
Definition: fatprocs.h:2697
smooth NULL
Definition: ftsmooth.c:416
void DPRINT(...)
Definition: polytest.cpp:61
PINICACHEKEY Key
Definition: inicache.h:42
struct _INICACHEKEY * Next
Definition: inicache.h:15

Referenced by FreeLdrEnumerateBootEntries(), and NtLdrEnumerateBootEntries().

◆ IniCacheGetKey()

NTSTATUS IniCacheGetKey ( PINICACHESECTION  Section,
PWCHAR  KeyName,
PWCHAR KeyData 
)

Definition at line 716 of file inicache.c.

720 {
722 
723  if (Section == NULL || KeyName == NULL || KeyData == NULL)
724  {
725  DPRINT("Invalid parameter\n");
727  }
728 
729  *KeyData = NULL;
730 
731  Key = IniCacheFindKey(Section, KeyName, wcslen(KeyName));
732  if (Key == NULL)
733  {
735  }
736 
737  *KeyData = Key->Data;
738 
739  return STATUS_SUCCESS;
740 }
_Must_inspect_result_ _Out_ PNDIS_STATUS _In_ NDIS_HANDLE _In_ ULONG _Out_ PNDIS_STRING KeyName
Definition: ndis.h:4711
IN PLARGE_INTEGER IN PLARGE_INTEGER PEPROCESS ULONG Key
Definition: fatprocs.h:2697
#define STATUS_INVALID_PARAMETER
Definition: udferr_usr.h:135
smooth NULL
Definition: ftsmooth.c:416
static PINICACHEKEY IniCacheFindKey(PINICACHESECTION Section, PWCHAR Name, ULONG NameLength)
Definition: inicache.c:79
void DPRINT(...)
Definition: polytest.cpp:61
return STATUS_SUCCESS
Definition: btrfs.c:2938
size_t __cdecl wcslen(_In_z_ const wchar_t *_Str)

Referenced by FreeLdrEnumerateBootEntries(), and QueryBootStoreOptions().

◆ IniCacheGetSection()

PINICACHESECTION IniCacheGetSection ( PINICACHE  Cache,
PWCHAR  Name 
)

Definition at line 683 of file inicache.c.

686 {
687  PINICACHESECTION Section = NULL;
688 
689  if (Cache == NULL || Name == NULL)
690  {
691  DPRINT("Invalid parameter\n");
692  return NULL;
693  }
694 
695  /* Iterate through list of sections */
696  Section = Cache->FirstSection;
697  while (Section != NULL)
698  {
699  DPRINT("Comparing '%S' and '%S'\n", Section->Name, Name);
700 
701  /* Are the section names the same? */
702  if (_wcsicmp(Section->Name, Name) == 0)
703  return Section;
704 
705  /* Get the next section */
706  Section = Section->Next;
707  }
708 
709  DPRINT("Section not found\n");
710 
711  return NULL;
712 }
Definition: fatfs.h:173
smooth NULL
Definition: ftsmooth.c:416
void DPRINT(...)
Definition: polytest.cpp:61
struct _INICACHESECTION * Next
Definition: inicache.h:27
_Check_return_ _CRTIMP int __cdecl _wcsicmp(_In_z_ const wchar_t *_Str1, _In_z_ const wchar_t *_Str2)

Referenced by CreateCommonFreeLdrSections(), FreeLdrEnumerateBootEntries(), and OpenIniBootLoaderStore().

◆ IniCacheInsertKey()

PINICACHEKEY IniCacheInsertKey ( PINICACHESECTION  Section,
PINICACHEKEY  AnchorKey,
INSERTION_TYPE  InsertionType,
PWCHAR  Name,
PWCHAR  Data 
)

Definition at line 826 of file inicache.c.

832 {
834 
835  Key = NULL;
836 
837  if (Section == NULL ||
838  Name == NULL ||
839  *Name == 0 ||
840  Data == NULL ||
841  *Data == 0)
842  {
843  DPRINT("Invalid parameter\n");
844  return NULL;
845  }
846 
847  /* Allocate key buffer */
850  sizeof(INICACHEKEY));
851  if (Key == NULL)
852  {
853  DPRINT("RtlAllocateHeap() failed\n");
854  return NULL;
855  }
856 
857  /* Allocate name buffer */
859  0,
860  (wcslen(Name) + 1) * sizeof(WCHAR));
861  if (Key->Name == NULL)
862  {
863  DPRINT("RtlAllocateHeap() failed\n");
865  return NULL;
866  }
867 
868  /* Copy value name */
869  wcscpy(Key->Name, Name);
870 
871  /* Allocate data buffer */
873  0,
874  (wcslen(Data) + 1) * sizeof(WCHAR));
875  if (Key->Data == NULL)
876  {
877  DPRINT("RtlAllocateHeap() failed\n");
878  RtlFreeHeap(ProcessHeap, 0, Key->Name);
880  return NULL;
881  }
882 
883  /* Copy value data */
884  wcscpy(Key->Data, Data);
885 
886  /* Insert key into section */
887  if (Section->FirstKey == NULL)
888  {
889  Section->FirstKey = Key;
890  Section->LastKey = Key;
891  }
892  else if ((InsertionType == INSERT_FIRST) ||
893  ((InsertionType == INSERT_BEFORE) && ((AnchorKey == NULL) || (AnchorKey == Section->FirstKey))))
894  {
895  /* Insert at the head of the list */
896  Section->FirstKey->Prev = Key;
897  Key->Next = Section->FirstKey;
898  Section->FirstKey = Key;
899  }
900  else if ((InsertionType == INSERT_BEFORE) && (AnchorKey != NULL))
901  {
902  /* Insert before the anchor key */
903  Key->Next = AnchorKey;
904  Key->Prev = AnchorKey->Prev;
905  AnchorKey->Prev->Next = Key;
906  AnchorKey->Prev = Key;
907  }
908  else if ((InsertionType == INSERT_LAST) ||
909  ((InsertionType == INSERT_AFTER) && ((AnchorKey == NULL) || (AnchorKey == Section->LastKey))))
910  {
911  Section->LastKey->Next = Key;
912  Key->Prev = Section->LastKey;
913  Section->LastKey = Key;
914  }
915  else if ((InsertionType == INSERT_AFTER) && (AnchorKey != NULL))
916  {
917  /* Insert after the anchor key */
918  Key->Next = AnchorKey->Next;
919  Key->Prev = AnchorKey;
920  AnchorKey->Next->Prev = Key;
921  AnchorKey->Next = Key;
922  }
923 
924  return Key;
925 }
PINICACHEKEY FirstKey
Definition: inicache.h:24
struct _INICACHEKEY * PINICACHEKEY
IN PLARGE_INTEGER IN PLARGE_INTEGER PEPROCESS ULONG Key
Definition: fatprocs.h:2697
PINICACHEKEY LastKey
Definition: inicache.h:25
BOOLEAN NTAPI RtlFreeHeap(IN PVOID HeapHandle, IN ULONG Flags, IN PVOID HeapBase)
Definition: heap.c:606
smooth NULL
Definition: ftsmooth.c:416
void DPRINT(...)
Definition: polytest.cpp:61
PVOID NTAPI RtlAllocateHeap(IN PVOID HeapHandle, IN ULONG Flags, IN SIZE_T Size)
Definition: heap.c:588
__wchar_t WCHAR
Definition: xmlstorage.h:180
HRESULT Next([in] ULONG celt, [out, size_is(celt), length_is(*pceltFetched)] STATPROPSETSTG *rgelt, [out] ULONG *pceltFetched)
struct _INICACHEKEY * Prev
Definition: inicache.h:16
_CRTIMP wchar_t *__cdecl wcscpy(_Out_writes_z_(_String_length_(_Source)+1) wchar_t *_Dest, _In_z_ const wchar_t *_Source)
struct _INICACHEKEY * Next
Definition: inicache.h:15
HANDLE ProcessHeap
Definition: servman.c:15
#define HEAP_ZERO_MEMORY
Definition: compat.h:123
size_t __cdecl wcslen(_In_z_ const wchar_t *_Str)

Referenced by AddBootStoreEntry(), CreateCommonFreeLdrSections(), CreateNTOSEntry(), InstallSetupInfFile(), and SetBootStoreOptions().

◆ IniCacheLoad()

NTSTATUS IniCacheLoad ( PINICACHE Cache,
PWCHAR  FileName,
BOOLEAN  String 
)

Definition at line 621 of file inicache.c.

625 {
631 
632  *Cache = NULL;
633 
634  /* Open the INI file */
636 
638  &Name,
640  NULL,
641  NULL);
642 
646  &IoStatusBlock,
649  if (!NT_SUCCESS(Status))
650  {
651  DPRINT("NtOpenFile() failed (Status %lx)\n", Status);
652  return Status;
653  }
654 
655  DPRINT("NtOpenFile() successful\n");
656 
658 
659  /* Close the INI file */
661  return Status;
662 }
#define FILE_GENERIC_READ
Definition: nt_native.h:653
IN PUNICODE_STRING IN POBJECT_ATTRIBUTES ObjectAttributes
Definition: conport.c:35
Definition: fatfs.h:173
LONG NTSTATUS
Definition: precomp.h:26
static WCHAR String[]
Definition: stringtable.c:55
#define FILE_SHARE_READ
Definition: compat.h:125
HANDLE FileHandle
Definition: stats.c:38
struct NameRec_ * Name
Definition: cdprocs.h:464
smooth NULL
Definition: ftsmooth.c:416
void DPRINT(...)
Definition: polytest.cpp:61
NTSYSAPI NTSTATUS NTAPI NtOpenFile(OUT PHANDLE phFile, IN ACCESS_MASK DesiredAccess, IN POBJECT_ATTRIBUTES ObjectAttributes, OUT PIO_STATUS_BLOCK pIoStatusBlock, IN ULONG ShareMode, IN ULONG OpenMode)
Definition: file.c:3951
#define NT_SUCCESS(StatCode)
Definition: apphelp.c:32
NTSTATUS IniCacheLoadByHandle(PINICACHE *Cache, HANDLE FileHandle, BOOLEAN String)
Definition: inicache.c:547
NTSTATUS NTAPI NtClose(IN HANDLE Handle)
Definition: obhandle.c:3399
#define OBJ_CASE_INSENSITIVE
Definition: winternl.h:228
#define FILE_NON_DIRECTORY_FILE
Definition: constants.h:492
#define SYNCHRONIZE
Definition: nt_native.h:61
Status
Definition: gdiplustypes.h:24
static OUT PIO_STATUS_BLOCK IoStatusBlock
Definition: pipe.c:75
#define FILE_SYNCHRONOUS_IO_NONALERT
Definition: from_kernel.h:31
NTSYSAPI VOID NTAPI RtlInitUnicodeString(PUNICODE_STRING DestinationString, PCWSTR SourceString)
#define InitializeObjectAttributes(p, n, a, r, s)
Definition: reg.c:106

Referenced by InstallSetupInfFile().

◆ IniCacheLoadByHandle()

NTSTATUS IniCacheLoadByHandle ( PINICACHE Cache,
HANDLE  FileHandle,
BOOLEAN  String 
)

Definition at line 547 of file inicache.c.

551 {
555  PCHAR FileBuffer;
558 
559  *Cache = NULL;
560 
561  /* Query file size */
563  &IoStatusBlock,
564  &FileInfo,
567  if (!NT_SUCCESS(Status))
568  {
569  DPRINT("NtQueryInformationFile() failed (Status %lx)\n", Status);
570  return Status;
571  }
572 
573  FileLength = FileInfo.EndOfFile.u.LowPart;
574 
575  DPRINT("File size: %lu\n", FileLength);
576 
577  /* Allocate file buffer with NULL-terminator */
578  FileBuffer = (CHAR*)RtlAllocateHeap(ProcessHeap,
579  0,
580  FileLength + 1);
581  if (FileBuffer == NULL)
582  {
583  DPRINT1("RtlAllocateHeap() failed\n");
585  }
586 
587  /* Read file */
588  FileOffset.QuadPart = 0ULL;
590  NULL,
591  NULL,
592  NULL,
593  &IoStatusBlock,
594  FileBuffer,
595  FileLength,
596  &FileOffset,
597  NULL);
598 
599  /* Append NULL-terminator */
600  FileBuffer[FileLength] = 0;
601 
602  if (!NT_SUCCESS(Status))
603  {
604  DPRINT("NtReadFile() failed (Status %lx)\n", Status);
605  goto Quit;
606  }
607 
609  if (!NT_SUCCESS(Status))
610  {
611  DPRINT1("IniCacheLoadFromMemory() failed (Status %lx)\n", Status);
612  }
613 
614 Quit:
615  /* Free the file buffer, and return */
616  RtlFreeHeap(ProcessHeap, 0, FileBuffer);
617  return Status;
618 }
signed char * PCHAR
Definition: retypes.h:7
_Out_ PNDIS_HANDLE _Out_ PUINT FileLength
Definition: ndis.h:3227
#define STATUS_INSUFFICIENT_RESOURCES
Definition: udferr_usr.h:158
Definition: fatfs.h:173
char CHAR
Definition: xmlstorage.h:175
LONG NTSTATUS
Definition: precomp.h:26
BOOLEAN NTAPI RtlFreeHeap(IN PVOID HeapHandle, IN ULONG Flags, IN PVOID HeapBase)
Definition: heap.c:606
NTSTATUS IniCacheLoadFromMemory(PINICACHE *Cache, PCHAR FileBuffer, ULONG FileLength, BOOLEAN String)
Definition: inicache.c:452
static WCHAR String[]
Definition: stringtable.c:55
HANDLE FileHandle
Definition: stats.c:38
smooth NULL
Definition: ftsmooth.c:416
void DPRINT(...)
Definition: polytest.cpp:61
#define ULL(a, b)
Definition: format_msg.c:27
PVOID NTAPI RtlAllocateHeap(IN PVOID HeapHandle, IN ULONG Flags, IN SIZE_T Size)
Definition: heap.c:588
#define NT_SUCCESS(StatCode)
Definition: apphelp.c:32
NTSTATUS NTAPI NtQueryInformationFile(HANDLE hFile, PIO_STATUS_BLOCK io, PVOID ptr, ULONG len, FILE_INFORMATION_CLASS FileInformationClass)
HANDLE ProcessHeap
Definition: servman.c:15
Status
Definition: gdiplustypes.h:24
_In_ PFCB _In_ LONGLONG FileOffset
Definition: cdprocs.h:151
static OUT PIO_STATUS_BLOCK IoStatusBlock
Definition: pipe.c:75
#define DPRINT1
Definition: precomp.h:8
#define FileStandardInformation
Definition: propsheet.cpp:61
struct FileInfo FileInfo
unsigned int ULONG
Definition: retypes.h:1
NTSTATUS NTAPI NtReadFile(HANDLE FileHandle, HANDLE Event, PIO_APC_ROUTINE ApcRoutine, PVOID ApcContext, PIO_STATUS_BLOCK IoStatusBlock, PVOID Buffer, ULONG Length, PLARGE_INTEGER ByteOffset, PULONG Key)

Referenced by IniCacheLoad().

◆ IniCacheLoadFromMemory()

NTSTATUS IniCacheLoadFromMemory ( PINICACHE Cache,
PCHAR  FileBuffer,
ULONG  FileLength,
BOOLEAN  String 
)

Definition at line 452 of file inicache.c.

457 {
458  PCHAR Ptr;
459 
460  PINICACHESECTION Section;
462 
463  PCHAR SectionName;
464  ULONG SectionNameSize;
465 
466  PCHAR KeyName;
467  ULONG KeyNameSize;
468 
469  PCHAR KeyValue;
470  ULONG KeyValueSize;
471 
472  /* Allocate inicache header */
475  sizeof(INICACHE));
476  if (*Cache == NULL)
477  {
478  DPRINT("RtlAllocateHeap() failed\n");
480  }
481 
482  /* Parse ini file */
483  Section = NULL;
484  Ptr = FileBuffer;
485  while (Ptr != NULL && *Ptr != 0)
486  {
488  if (Ptr == NULL)
489  continue;
490 
491  if (*Ptr == '[')
492  {
493  Section = NULL;
494  Ptr++;
495 
497  &SectionName,
498  &SectionNameSize);
499 
500  DPRINT("[%.*s]\n", SectionNameSize, SectionName);
501 
502  Section = IniCacheAddSection(*Cache,
503  SectionName,
504  SectionNameSize);
505  if (Section == NULL)
506  {
507  DPRINT("IniCacheAddSection() failed\n");
509  continue;
510  }
511  }
512  else
513  {
514  if (Section == NULL)
515  {
517  continue;
518  }
519 
521  &KeyName,
522  &KeyNameSize);
523 
525  &KeyValue,
526  &KeyValueSize,
527  String);
528 
529  DPRINT("'%.*s' = '%.*s'\n", KeyNameSize, KeyName, KeyValueSize, KeyValue);
530 
531  Key = IniCacheAddKey(Section,
532  KeyName,
533  KeyNameSize,
534  KeyValue,
535  KeyValueSize);
536  if (Key == NULL)
537  {
538  DPRINT("IniCacheAddKey() failed\n");
539  }
540  }
541  }
542 
543  return STATUS_SUCCESS;
544 }
static PCHAR IniCacheGetSectionName(PCHAR Ptr, PCHAR *NamePtr, PULONG NameSize)
Definition: inicache.c:280
signed char * PCHAR
Definition: retypes.h:7
_Must_inspect_result_ _Out_ PNDIS_STATUS _In_ NDIS_HANDLE _In_ ULONG _Out_ PNDIS_STRING KeyName
Definition: ndis.h:4711
static PINICACHEKEY IniCacheAddKey(PINICACHESECTION Section, PCHAR Name, ULONG NameLength, PCHAR Data, ULONG DataLength)
Definition: inicache.c:104
#define STATUS_INSUFFICIENT_RESOURCES
Definition: udferr_usr.h:158
static PCHAR IniCacheGetKeyValue(PCHAR Ptr, PCHAR *DataPtr, PULONG DataSize, BOOLEAN String)
Definition: inicache.c:378
IN PLARGE_INTEGER IN PLARGE_INTEGER PEPROCESS ULONG Key
Definition: fatprocs.h:2697
static PINICACHESECTION IniCacheAddSection(PINICACHE Cache, PCHAR Name, ULONG NameLength)
Definition: inicache.c:189
Definition: fatfs.h:173
_Must_inspect_result_ _In_ PFSRTL_PER_STREAM_CONTEXT Ptr
Definition: fsrtlfuncs.h:898
static WCHAR String[]
Definition: stringtable.c:55
static PCHAR IniCacheGetKeyName(PCHAR Ptr, PCHAR *NamePtr, PULONG NameSize)
Definition: inicache.c:325
smooth NULL
Definition: ftsmooth.c:416
void DPRINT(...)
Definition: polytest.cpp:61
PVOID NTAPI RtlAllocateHeap(IN PVOID HeapHandle, IN ULONG Flags, IN SIZE_T Size)
Definition: heap.c:588
static PCHAR IniCacheSkipToNextSection(PCHAR Ptr)
Definition: inicache.c:261
HANDLE ProcessHeap
Definition: servman.c:15
static PCHAR IniCacheSkipWhitespace(PCHAR Ptr)
Definition: inicache.c:249
#define HEAP_ZERO_MEMORY
Definition: compat.h:123
struct _INICACHE * PINICACHE
unsigned int ULONG
Definition: retypes.h:1
return STATUS_SUCCESS
Definition: btrfs.c:2938

Referenced by IniCacheLoadByHandle(), and OpenIniBootLoaderStore().

◆ IniCacheSave()

NTSTATUS IniCacheSave ( PINICACHE  Cache,
PWCHAR  FileName 
)

Definition at line 1043 of file inicache.c.

1046 {
1047  NTSTATUS Status;
1052 
1053  /* Create the INI file */
1055 
1057  &Name,
1059  NULL,
1060  NULL);
1061 
1065  &IoStatusBlock,
1066  NULL,
1068  0,
1071  NULL,
1072  0);
1073  if (!NT_SUCCESS(Status))
1074  {
1075  DPRINT("NtCreateFile() failed (Status %lx)\n", Status);
1076  return Status;
1077  }
1078 
1080 
1081  /* Close the INI file */
1083  return Status;
1084 }
IN PUNICODE_STRING IN POBJECT_ATTRIBUTES ObjectAttributes
Definition: conport.c:35
#define FILE_SEQUENTIAL_ONLY
Definition: from_kernel.h:27
Definition: fatfs.h:173
LONG NTSTATUS
Definition: precomp.h:26
HANDLE FileHandle
Definition: stats.c:38
struct NameRec_ * Name
Definition: cdprocs.h:464
smooth NULL
Definition: ftsmooth.c:416
void DPRINT(...)
Definition: polytest.cpp:61
NTSTATUS NTAPI NtCreateFile(OUT PHANDLE FileHandle, IN ACCESS_MASK DesiredAccess, IN POBJECT_ATTRIBUTES ObjectAttributes, OUT PIO_STATUS_BLOCK IoStatusBlock, IN PLARGE_INTEGER AllocationSize OPTIONAL, IN ULONG FileAttributes, IN ULONG ShareAccess, IN ULONG CreateDisposition, IN ULONG CreateOptions, IN PVOID EaBuffer OPTIONAL, IN ULONG EaLength)
#define NT_SUCCESS(StatCode)
Definition: apphelp.c:32
NTSTATUS NTAPI NtClose(IN HANDLE Handle)
Definition: obhandle.c:3399
#define OBJ_CASE_INSENSITIVE
Definition: winternl.h:228
#define FILE_ATTRIBUTE_NORMAL
Definition: compat.h:126
#define FILE_NON_DIRECTORY_FILE
Definition: constants.h:492
#define SYNCHRONIZE
Definition: nt_native.h:61
Status
Definition: gdiplustypes.h:24
#define FILE_GENERIC_WRITE
Definition: nt_native.h:660
static OUT PIO_STATUS_BLOCK IoStatusBlock
Definition: pipe.c:75
#define FILE_SYNCHRONOUS_IO_NONALERT
Definition: from_kernel.h:31
#define FILE_SUPERSEDE
Definition: from_kernel.h:53
NTSYSAPI VOID NTAPI RtlInitUnicodeString(PUNICODE_STRING DestinationString, PCWSTR SourceString)
#define InitializeObjectAttributes(p, n, a, r, s)
Definition: reg.c:106
NTSTATUS IniCacheSaveByHandle(PINICACHE Cache, HANDLE FileHandle)
Definition: inicache.c:948

Referenced by InstallSetupInfFile().

◆ IniCacheSaveByHandle()

NTSTATUS IniCacheSaveByHandle ( PINICACHE  Cache,
HANDLE  FileHandle 
)

Definition at line 948 of file inicache.c.

951 {
953  PINICACHESECTION Section;
956  PCHAR Buffer;
957  PCHAR Ptr;
958  ULONG Len;
961 
962  /* Calculate required buffer size */
963  BufferSize = 0;
964  Section = Cache->FirstSection;
965  while (Section != NULL)
966  {
967  BufferSize += (Section->Name ? wcslen(Section->Name) : 0)
968  + 4; /* "[]\r\n" */
969 
970  Key = Section->FirstKey;
971  while (Key != NULL)
972  {
973  BufferSize += wcslen(Key->Name)
974  + (Key->Data ? wcslen(Key->Data) : 0)
975  + 3; /* "=\r\n" */
976  Key = Key->Next;
977  }
978 
979  Section = Section->Next;
980  if (Section != NULL)
981  BufferSize += 2; /* Extra "\r\n" at end of each section */
982  }
983 
984  DPRINT("BufferSize: %lu\n", BufferSize);
985 
986  /* Allocate file buffer with NULL-terminator */
989  BufferSize + 1);
990  if (Buffer == NULL)
991  {
992  DPRINT1("RtlAllocateHeap() failed\n");
994  }
995 
996  /* Fill file buffer */
997  Ptr = Buffer;
998  Section = Cache->FirstSection;
999  while (Section != NULL)
1000  {
1001  Len = sprintf(Ptr, "[%S]\r\n", Section->Name);
1002  Ptr += Len;
1003 
1004  Key = Section->FirstKey;
1005  while (Key != NULL)
1006  {
1007  Len = sprintf(Ptr, "%S=%S\r\n", Key->Name, Key->Data);
1008  Ptr += Len;
1009  Key = Key->Next;
1010  }
1011 
1012  Section = Section->Next;
1013  if (Section != NULL)
1014  {
1015  Len = sprintf(Ptr, "\r\n");
1016  Ptr += Len;
1017  }
1018  }
1019 
1020  /* Write to the INI file */
1021  Offset.QuadPart = 0LL;
1023  NULL,
1024  NULL,
1025  NULL,
1026  &IoStatusBlock,
1027  Buffer,
1028  BufferSize,
1029  &Offset,
1030  NULL);
1031  if (!NT_SUCCESS(Status))
1032  {
1033  DPRINT("NtWriteFile() failed (Status %lx)\n", Status);
1035  return Status;
1036  }
1037 
1039  return STATUS_SUCCESS;
1040 }
signed char * PCHAR
Definition: retypes.h:7
PINICACHEKEY FirstKey
Definition: inicache.h:24
#define LL
Definition: tui.h:85
#define STATUS_INSUFFICIENT_RESOURCES
Definition: udferr_usr.h:158
IN PLARGE_INTEGER IN PLARGE_INTEGER PEPROCESS ULONG Key
Definition: fatprocs.h:2697
Definition: fatfs.h:173
char CHAR
Definition: xmlstorage.h:175
_Must_inspect_result_ _In_ PFSRTL_PER_STREAM_CONTEXT Ptr
Definition: fsrtlfuncs.h:898
LONG NTSTATUS
Definition: precomp.h:26
BOOLEAN NTAPI RtlFreeHeap(IN PVOID HeapHandle, IN ULONG Flags, IN PVOID HeapBase)
Definition: heap.c:606
#define sprintf(buf, format,...)
Definition: sprintf.c:55
HANDLE FileHandle
Definition: stats.c:38
_In_ ULONG _In_ ULONG Offset
Definition: ntddpcm.h:101
smooth NULL
Definition: ftsmooth.c:416
void DPRINT(...)
Definition: polytest.cpp:61
Definition: bufpool.h:45
PVOID NTAPI RtlAllocateHeap(IN PVOID HeapHandle, IN ULONG Flags, IN SIZE_T Size)
Definition: heap.c:588
#define NT_SUCCESS(StatCode)
Definition: apphelp.c:32
#define BufferSize
Definition: classpnp.h:419
#define Len
Definition: deflate.h:82
NTSYSAPI NTSTATUS NTAPI NtWriteFile(IN HANDLE hFile, IN HANDLE hEvent OPTIONAL, IN PIO_APC_ROUTINE IoApcRoutine OPTIONAL, IN PVOID IoApcContext OPTIONAL, OUT PIO_STATUS_BLOCK pIoStatusBlock, IN PVOID WriteBuffer, IN ULONG WriteBufferLength, IN PLARGE_INTEGER FileOffset OPTIONAL, IN PULONG LockOperationKey OPTIONAL)
HANDLE ProcessHeap
Definition: servman.c:15
Status
Definition: gdiplustypes.h:24
static OUT PIO_STATUS_BLOCK IoStatusBlock
Definition: pipe.c:75
#define HEAP_ZERO_MEMORY
Definition: compat.h:123
#define DPRINT1
Definition: precomp.h:8
unsigned int ULONG
Definition: retypes.h:1
struct _INICACHESECTION * Next
Definition: inicache.h:27
IN BOOLEAN OUT PSTR Buffer
Definition: progress.h:34
return STATUS_SUCCESS
Definition: btrfs.c:2938
size_t __cdecl wcslen(_In_z_ const wchar_t *_Str)

Referenced by CloseIniBootLoaderStore(), and IniCacheSave().