2 * COPYRIGHT: See COPYING in the top level directory
3 * PROJECT: ReactOS kernel
4 * FILE: services/fs/minix/minix.c
6 * PROGRAMMER: David Welch (welch@mcmail.com)
10 /* INCLUDES *****************************************************************/
12 #include <ddk/ntddk.h>
20 /* FUNCTIONS ****************************************************************/
22 BOOLEAN MinixCompareUnicodeStringToAnsi(PCH AnsiStr,
30 if ((*AnsiStr)!=(*UnicodeStr))
34 if ((*AnsiStr)==0 && (*UnicodeStr)==0)
45 #define ENTRIES_PER_BLOCK (BLOCKSIZE / MINIX_DIR_ENTRY_SIZE)
47 ULONG MinixDirLookup(PMINIX_DEVICE_EXTENSION DeviceExt,
48 PDEVICE_OBJECT DeviceObject,
49 struct minix_inode* dir,
52 struct minix_dir_entry* current_entry = NULL;
59 DPRINT("MinixDirLookup(DeviceExt %x, dir %x, Name %S)\n",DeviceExt,dir,
62 Block = ExAllocatePool(NonPagedPool, 512);
64 for (i=0;i<(dir->i_size/MINIX_DIR_ENTRY_SIZE);i++)
67 offset = i*MINIX_DIR_ENTRY_SIZE;
68 if ((offset%BLOCKSIZE)==0)
70 MinixReadBlock(DeviceObject,
75 MinixReadSector(DeviceObject,
79 current_entry = (struct minix_dir_entry *)
80 (Block+offset%BLOCKSIZE);
81 DPRINT("Inode %x Name %.30s\n",current_entry->inode,
83 if (MinixCompareUnicodeStringToAnsi(current_entry->name,
86 inode = current_entry->inode;
88 DPRINT("MinixDirLookup() = %d\n",inode);
94 DPRINT("MinixDirLookup() = %d\n",0);
98 NTSTATUS MinixOpen(PDEVICE_OBJECT DeviceObject,
99 MINIX_DEVICE_EXTENSION* DeviceExt,
100 PFILE_OBJECT FileObject,
101 PMINIX_FSCONTEXT result,
107 struct minix_inode current_dir;
108 unsigned int current_ino;
110 string = ExAllocatePool(NonPagedPool,
111 2*(wcslen(FileObject->FileName.Buffer)+1));
112 wcscpy(string, FileObject->FileName.Buffer);
114 DbgPrint("MinixOpen(DeviceObject %x, DeviceName %S, result %x)\n",
115 DeviceObject,string,result);
121 current_ino = MINIX_ROOT_INO;
123 while (next != NULL && current_ino != 0)
125 MinixReadInode(DeviceObject,DeviceExt,current_ino,¤t_dir);
127 DPRINT("current %S next %x\n",current,next);
131 next = wcschr(next+1,'\\');
137 current_ino = MinixDirLookup(DeviceExt,
142 if (next == NULL && current_ino != 0)
144 MinixReadInode(DeviceObject,DeviceExt,current_ino,¤t_dir);
148 (*Information) = FILE_DOES_NOT_EXIST;
149 return(STATUS_UNSUCCESSFUL);
152 result = ExAllocatePool(NonPagedPool, sizeof(MINIX_FSCONTEXT));
153 memcpy(&result->inode,¤t_dir,sizeof(struct minix_inode));
155 DPRINT("MinxOpen() = STATUS_SUCCESS\n",0);
156 return(STATUS_SUCCESS);
160 MinixClose(PDEVICE_OBJECT DeviceObject,
163 PIO_STACK_LOCATION Stack = IoGetCurrentIrpStackLocation(Irp);
164 PFILE_OBJECT FileObject = Stack->FileObject;
166 DPRINT("MinixClose(DeviceObject %x Irp %x)\n",DeviceObject,Irp);
168 ExFreePool(FileObject->FsContext);
170 Irp->IoStatus.Status = STATUS_SUCCESS;
171 Irp->IoStatus.Information = 0;
173 IoCompleteRequest(Irp, IO_NO_INCREMENT);
174 return(STATUS_SUCCESS);
178 MinixDirectoryControl(PDEVICE_OBJECT DeviceObject,
181 PIO_STACK_LOCATION Stack = IoGetCurrentIrpStackLocation(Irp);
182 // PFILE_OBJECT FileObject = Stack->FileObject;
184 if (Stack->MinorFunction != IRP_MN_QUERY_DIRECTORY)
186 return(STATUS_NOT_IMPLEMENTED);
189 Irp->IoStatus.Status = STATUS_SUCCESS;
190 Irp->IoStatus.Information = 0;
192 IoCompleteRequest(Irp, IO_NO_INCREMENT);
193 return(STATUS_SUCCESS);
197 MinixCreate(PDEVICE_OBJECT DeviceObject,
200 PIO_STACK_LOCATION Stack = IoGetCurrentIrpStackLocation(Irp);
201 PFILE_OBJECT FileObject = Stack->FileObject;
203 PMINIX_FSCONTEXT result;
204 MINIX_DEVICE_EXTENSION* DeviceExt;
206 DPRINT("MinixCreate(DeviceObject %x, Irp %x)\n",DeviceObject,Irp);
207 DPRINT("Opening file %x %S\n",FileObject->FileName.Buffer,
208 FileObject->FileName.Buffer);
209 DPRINT("FileObject->FileName.Buffer %x\n",
210 FileObject->FileName.Buffer);
212 DeviceExt = (MINIX_DEVICE_EXTENSION *)DeviceObject->DeviceExtension;
213 result = ExAllocatePool(NonPagedPool,sizeof(struct minix_inode));
214 DPRINT("result %x\n",result);
215 Status = MinixOpen(DeviceExt->AttachedDevice,
219 &Irp->IoStatus.Information);
221 if (NT_SUCCESS(Status))
223 FileObject->FsContext = result;
226 Irp->IoStatus.Status = Status;
227 Irp->IoStatus.Information = 0;
229 DPRINT("Finished MinixCreate()\n");
231 IoCompleteRequest(Irp, IO_NO_INCREMENT);