2 * COPYRIGHT: See COPYING in the top level directory
3 * PROJECT: File Management IFS Utility functions
4 * FILE: reactos/dll/win32/fmifs/init.c
5 * PURPOSE: Initialisation
7 * PROGRAMMERS: Emanuele Aliberti
8 * Hervé Poussineau (hpoussin@reactos.org)
14 #include <ndk/cmfuncs.h>
15 #include <ndk/obfuncs.h>
17 static BOOLEAN FmIfsInitialized
= FALSE
;
18 LIST_ENTRY ProviderListHead
;
24 PLIST_ENTRY ListEntry
;
25 PIFS_PROVIDER Provider
;
27 ListEntry
= ProviderListHead
.Flink
;
28 while (ListEntry
!= &ProviderListHead
)
30 Provider
= CONTAINING_RECORD(ListEntry
, IFS_PROVIDER
, ListEntry
);
31 if (_wcsicmp(Provider
->Name
, FileSystem
) == 0)
33 ListEntry
= ListEntry
->Flink
;
36 /* Provider not found */
44 IN PCUNICODE_STRING FileSystem
,
47 PIFS_PROVIDER Provider
= NULL
;
52 hMod
= LoadLibraryW(DllFile
);
56 RequiredSize
= FIELD_OFFSET(IFS_PROVIDER
, Name
)
57 + FileSystem
->Length
+ sizeof(UNICODE_NULL
);
58 Provider
= (PIFS_PROVIDER
)RtlAllocateHeap(
64 RtlZeroMemory(Provider
, RequiredSize
);
66 /* Get function pointers */
67 Provider
->ChkdskEx
= (CHKDSKEX
)GetProcAddress(hMod
, "ChkdskEx");
68 //Provider->Extend = (EXTEND)GetProcAddress(hMod, "Extend");
69 Provider
->FormatEx
= (FORMATEX
)GetProcAddress(hMod
, "FormatEx");
71 RtlCopyMemory(Provider
->Name
, FileSystem
->Buffer
, FileSystem
->Length
);
73 InsertTailList(&ProviderListHead
, &Provider
->ListEntry
);
82 RtlFreeHeap(RtlGetProcessHeap(), 0, Provider
);
89 InitializeFmIfsOnce(VOID
)
91 OBJECT_ATTRIBUTES ObjectAttributes
;
92 UNICODE_STRING RegistryPath
93 = RTL_CONSTANT_STRING(L
"\\REGISTRY\\Machine\\SOFTWARE\\ReactOS\\ReactOS\\CurrentVersion\\IFS");
95 PKEY_VALUE_FULL_INFORMATION Buffer
;
96 ULONG BufferSize
= sizeof(KEY_VALUE_FULL_INFORMATION
) + MAX_PATH
;
103 InitializeListHead(&ProviderListHead
);
105 /* Read IFS providers from HKLM\SOFTWARE\ReactOS\ReactOS\CurrentVersion\IFS */
106 InitializeObjectAttributes(&ObjectAttributes
, &RegistryPath
, 0, NULL
, NULL
);
107 Status
= NtOpenKey(&hKey
, KEY_QUERY_VALUE
, &ObjectAttributes
);
108 if (Status
== STATUS_OBJECT_NAME_NOT_FOUND
)
110 else if (!NT_SUCCESS(Status
))
113 Buffer
= (PKEY_VALUE_FULL_INFORMATION
)RtlAllocateHeap(
125 Status
= NtEnumerateValueKey(
128 KeyValueFullInformation
,
132 if (Status
== STATUS_BUFFER_OVERFLOW
)
134 else if (!NT_SUCCESS(Status
))
136 else if (Buffer
->Type
!= REG_SZ
)
139 Name
.Length
= Name
.MaximumLength
= Buffer
->NameLength
;
140 Name
.Buffer
= Buffer
->Name
;
141 Data
.Length
= Data
.MaximumLength
= Buffer
->DataLength
;
142 Data
.Buffer
= (PWCHAR
)((ULONG_PTR
)Buffer
+ Buffer
->DataOffset
);
143 if (Data
.Length
> sizeof(WCHAR
) && Data
.Buffer
[Data
.Length
/ sizeof(WCHAR
) - 1] == UNICODE_NULL
)
144 Data
.Length
-= sizeof(WCHAR
);
146 AddProvider(&Name
, Data
.Buffer
);
150 RtlFreeHeap(RtlGetProcessHeap(), 0, Buffer
);
164 case DLL_PROCESS_ATTACH
:
165 if (FmIfsInitialized
== FALSE
)
167 if (InitializeFmIfsOnce() == FALSE
)
172 FmIfsInitialized
= TRUE
;
176 case DLL_THREAD_ATTACH
:
179 case DLL_THREAD_DETACH
:
182 case DLL_PROCESS_DETACH
: