ReactOS Fundraising Campaign 2012
 
€ 4,410 / € 30,000

Information | Donate

Home | Info | Community | Development | myReactOS | Contact Us

  1. Home
  2. Community
  3. Development
  4. myReactOS
  5. Fundraiser 2012

  1. Main Page
  2. Alphabetical List
  3. Data Structures
  4. Directories
  5. File List
  6. Data Fields
  7. Globals
  8. Related Pages

ReactOS Development > Doxygen

init.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 doxygen 1.7.6.1

ReactOS is a registered trademark or a trademark of ReactOS Foundation in the United States and other countries.