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)
15 #define NTOS_MODE_USER
16 #include <ndk/cmfuncs.h>
17 #include <ndk/obfuncs.h>
19 static BOOLEAN FmIfsInitialized
= FALSE
;
20 LIST_ENTRY ProviderListHead
;
26 PLIST_ENTRY ListEntry
;
27 PIFS_PROVIDER Provider
;
29 ListEntry
= ProviderListHead
.Flink
;
30 while (ListEntry
!= &ProviderListHead
)
32 Provider
= CONTAINING_RECORD(ListEntry
, IFS_PROVIDER
, ListEntry
);
33 if (_wcsicmp(Provider
->Name
, FileSystem
) == 0)
35 ListEntry
= ListEntry
->Flink
;
38 /* Provider not found */
46 IN PCUNICODE_STRING FileSystem
,
49 PIFS_PROVIDER Provider
= NULL
;
54 hMod
= LoadLibraryW(DllFile
);
58 RequiredSize
= FIELD_OFFSET(IFS_PROVIDER
, Name
)
59 + FileSystem
->Length
+ sizeof(UNICODE_NULL
);
60 Provider
= (PIFS_PROVIDER
)RtlAllocateHeap(
66 RtlZeroMemory(Provider
, RequiredSize
);
68 /* Get function pointers */
69 Provider
->ChkdskEx
= (CHKDSKEX
)GetProcAddress(hMod
, "ChkdskEx");
70 //Provider->Extend = (EXTEND)GetProcAddress(hMod, "Extend");
71 Provider
->FormatEx
= (FORMATEX
)GetProcAddress(hMod
, "FormatEx");
73 RtlCopyMemory(Provider
->Name
, FileSystem
->Buffer
, FileSystem
->Length
);
75 InsertTailList(&ProviderListHead
, &Provider
->ListEntry
);
84 RtlFreeHeap(RtlGetProcessHeap(), 0, Provider
);
91 InitializeFmIfsOnce(VOID
)
93 OBJECT_ATTRIBUTES ObjectAttributes
;
94 UNICODE_STRING RegistryPath
95 = RTL_CONSTANT_STRING(L
"\\REGISTRY\\Machine\\SOFTWARE\\ReactOS\\ReactOS\\CurrentVersion\\IFS");
97 PKEY_VALUE_FULL_INFORMATION Buffer
;
98 ULONG BufferSize
= sizeof(KEY_VALUE_FULL_INFORMATION
) + MAX_PATH
;
105 InitializeListHead(&ProviderListHead
);
107 /* Read IFS providers from HKLM\SOFTWARE\ReactOS\ReactOS\CurrentVersion\IFS */
108 InitializeObjectAttributes(&ObjectAttributes
, &RegistryPath
, 0, NULL
, NULL
);
109 Status
= NtOpenKey(&hKey
, KEY_QUERY_VALUE
, &ObjectAttributes
);
110 if (Status
== STATUS_OBJECT_NAME_NOT_FOUND
)
112 else if (!NT_SUCCESS(Status
))
115 Buffer
= (PKEY_VALUE_FULL_INFORMATION
)RtlAllocateHeap(
127 Status
= NtEnumerateValueKey(
130 KeyValueFullInformation
,
134 if (Status
== STATUS_BUFFER_OVERFLOW
)
136 else if (!NT_SUCCESS(Status
))
138 else if (Buffer
->Type
!= REG_SZ
)
141 Name
.Length
= Name
.MaximumLength
= Buffer
->NameLength
;
142 Name
.Buffer
= Buffer
->Name
;
143 Data
.Length
= Data
.MaximumLength
= Buffer
->DataLength
;
144 Data
.Buffer
= (PWCHAR
)((ULONG_PTR
)Buffer
+ Buffer
->DataOffset
);
145 if (Data
.Length
> sizeof(WCHAR
) && Data
.Buffer
[Data
.Length
/ sizeof(WCHAR
) - 1] == UNICODE_NULL
)
146 Data
.Length
-= sizeof(WCHAR
);
148 AddProvider(&Name
, Data
.Buffer
);
152 RtlFreeHeap(RtlGetProcessHeap(), 0, Buffer
);
166 case DLL_PROCESS_ATTACH
:
167 if (FmIfsInitialized
== FALSE
)
169 if (InitializeFmIfsOnce() == FALSE
)
172 FmIfsInitialized
= TRUE
;
176 case DLL_THREAD_ATTACH
:
179 case DLL_THREAD_DETACH
:
182 case DLL_PROCESS_DETACH
: