Home | Info | Community | Development | myReactOS | Contact Us
ReactOS Development > Doxygeninit.c
Go to the documentation of this file.
00001 /* 00002 * COPYRIGHT: See COPYING in the top level directory 00003 * PROJECT: File Management IFS Utility functions 00004 * FILE: reactos/dll/win32/fmifs/init.c 00005 * PURPOSE: Initialisation 00006 * 00007 * PROGRAMMERS: Emanuele Aliberti 00008 * Hervé Poussineau (hpoussin@reactos.org) 00009 */ 00010 00011 #include "precomp.h" 00012 00013 static BOOLEAN FmIfsInitialized = FALSE; 00014 LIST_ENTRY ProviderListHead; 00015 00016 PIFS_PROVIDER 00017 GetProvider( 00018 IN PWCHAR FileSystem) 00019 { 00020 PLIST_ENTRY ListEntry; 00021 PIFS_PROVIDER Provider; 00022 00023 ListEntry = ProviderListHead.Flink; 00024 while (ListEntry != &ProviderListHead) 00025 { 00026 Provider = CONTAINING_RECORD(ListEntry, IFS_PROVIDER, ListEntry); 00027 if (_wcsicmp(Provider->Name, FileSystem) == 0) 00028 return Provider; 00029 ListEntry = ListEntry->Flink; 00030 } 00031 00032 /* Provider not found */ 00033 return NULL; 00034 } 00035 00036 static BOOLEAN 00037 AddProvider( 00038 IN PCUNICODE_STRING FileSystem, 00039 IN PWCHAR DllFile) 00040 { 00041 PIFS_PROVIDER Provider = NULL; 00042 ULONG RequiredSize; 00043 HMODULE hMod = NULL; 00044 BOOLEAN ret = FALSE; 00045 00046 hMod = LoadLibraryW(DllFile); 00047 if (!hMod) 00048 goto cleanup; 00049 00050 RequiredSize = FIELD_OFFSET(IFS_PROVIDER, Name) 00051 + FileSystem->Length + sizeof(UNICODE_NULL); 00052 Provider = (PIFS_PROVIDER)RtlAllocateHeap( 00053 RtlGetProcessHeap(), 00054 0, 00055 RequiredSize); 00056 if (!Provider) 00057 goto cleanup; 00058 RtlZeroMemory(Provider, RequiredSize); 00059 00060 /* Get function pointers */ 00061 Provider->ChkdskEx = (CHKDSKEX)GetProcAddress(hMod, "ChkdskEx"); 00062 //Provider->Extend = (EXTEND)GetProcAddress(hMod, "Extend"); 00063 Provider->FormatEx = (FORMATEX)GetProcAddress(hMod, "FormatEx"); 00064 00065 RtlCopyMemory(Provider->Name, FileSystem->Buffer, FileSystem->Length); 00066 00067 InsertTailList(&ProviderListHead, &Provider->ListEntry); 00068 ret = TRUE; 00069 00070 cleanup: 00071 if (!ret) 00072 { 00073 if (hMod) 00074 FreeLibrary(hMod); 00075 if (Provider) 00076 RtlFreeHeap(RtlGetProcessHeap(), 0, Provider); 00077 } 00078 return ret; 00079 } 00080 00081 static BOOLEAN 00082 InitializeFmIfsOnce(void) 00083 { 00084 OBJECT_ATTRIBUTES ObjectAttributes; 00085 UNICODE_STRING RegistryPath 00086 = RTL_CONSTANT_STRING(L"\\REGISTRY\\Machine\\SOFTWARE\\ReactOS\\ReactOS\\CurrentVersion\\IFS"); 00087 HANDLE hKey = NULL; 00088 PKEY_VALUE_FULL_INFORMATION Buffer; 00089 ULONG BufferSize = sizeof(KEY_VALUE_FULL_INFORMATION) + MAX_PATH; 00090 ULONG RequiredSize; 00091 ULONG i = 0; 00092 UNICODE_STRING Name; 00093 UNICODE_STRING Data; 00094 NTSTATUS Status; 00095 00096 InitializeListHead(&ProviderListHead); 00097 00098 /* Read IFS providers from HKLM\SOFTWARE\ReactOS\ReactOS\CurrentVersion\IFS */ 00099 InitializeObjectAttributes(&ObjectAttributes, &RegistryPath, 0, NULL, NULL); 00100 Status = NtOpenKey(&hKey, KEY_QUERY_VALUE, &ObjectAttributes); 00101 if (Status == STATUS_OBJECT_NAME_NOT_FOUND) 00102 return TRUE; 00103 else if (!NT_SUCCESS(Status)) 00104 return FALSE; 00105 00106 Buffer = (PKEY_VALUE_FULL_INFORMATION)RtlAllocateHeap( 00107 RtlGetProcessHeap(), 00108 0, 00109 BufferSize); 00110 if (!Buffer) 00111 { 00112 NtClose(hKey); 00113 return FALSE; 00114 } 00115 00116 while (TRUE) 00117 { 00118 Status = NtEnumerateValueKey( 00119 hKey, 00120 i++, 00121 KeyValueFullInformation, 00122 Buffer, 00123 BufferSize, 00124 &RequiredSize); 00125 if (Status == STATUS_BUFFER_OVERFLOW) 00126 continue; 00127 else if (!NT_SUCCESS(Status)) 00128 break; 00129 else if (Buffer->Type != REG_SZ) 00130 continue; 00131 00132 Name.Length = Name.MaximumLength = Buffer->NameLength; 00133 Name.Buffer = Buffer->Name; 00134 Data.Length = Data.MaximumLength = Buffer->DataLength; 00135 Data.Buffer = (PWCHAR)((ULONG_PTR)Buffer + Buffer->DataOffset); 00136 if (Data.Length > sizeof(WCHAR) && Data.Buffer[Data.Length / sizeof(WCHAR) - 1] == UNICODE_NULL) 00137 Data.Length -= sizeof(WCHAR); 00138 00139 AddProvider(&Name, Data.Buffer); 00140 } 00141 00142 NtClose(hKey); 00143 RtlFreeHeap(RtlGetProcessHeap(), 0, Buffer); 00144 return TRUE; 00145 } 00146 00147 /* FMIFS.8 */ 00148 BOOLEAN NTAPI 00149 InitializeFmIfs( 00150 IN PVOID hinstDll, 00151 IN DWORD dwReason, 00152 IN PVOID reserved) 00153 { 00154 switch (dwReason) 00155 { 00156 case DLL_PROCESS_ATTACH: 00157 if (FALSE == FmIfsInitialized) 00158 { 00159 if (FALSE == InitializeFmIfsOnce()) 00160 { 00161 return FALSE; 00162 } 00163 00164 FmIfsInitialized = TRUE; 00165 } 00166 break; 00167 00168 case DLL_THREAD_ATTACH: 00169 break; 00170 00171 case DLL_THREAD_DETACH: 00172 break; 00173 00174 case DLL_PROCESS_DETACH: 00175 break; 00176 } 00177 00178 return TRUE; 00179 } 00180 00181 /* EOF */ Generated on Sun May 27 2012 04:23:31 for ReactOS by
1.7.6.1
|