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 *****************************************************************/
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
);