3 * Copyright (C) 2002 ReactOS Team
5 * This program is free software; you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License as published by
7 * the Free Software Foundation; either version 2 of the License, or
8 * (at your option) any later version.
10 * This program is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 * GNU General Public License for more details.
15 * You should have received a copy of the GNU General Public License
16 * along with this program; if not, write to the Free Software
17 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
19 /* $Id: blockdev.c,v 1.4 2003/11/13 15:25:28 ekohl Exp $
21 * COPYRIGHT: See COPYING in the top level directory
22 * PROJECT: ReactOS kernel
23 * FILE: services/fs/fs_rec/blockdev.c
24 * PURPOSE: Filesystem recognizer driver
25 * PROGRAMMER: Eric Kohl
28 /* INCLUDES *****************************************************************/
30 #include <ddk/ntddk.h>
38 /* FUNCTIONS ****************************************************************/
41 FsRecReadSectors(IN PDEVICE_OBJECT DeviceObject
,
47 IO_STATUS_BLOCK IoStatus
;
54 Event
= ExAllocatePool(NonPagedPool
, sizeof(KEVENT
));
57 return(STATUS_INSUFFICIENT_RESOURCES
);
60 KeInitializeEvent(Event
,
64 Offset
.QuadPart
= (LONGLONG
)DiskSector
* (LONGLONG
)SectorSize
;
65 BlockSize
= SectorCount
* SectorSize
;
67 DPRINT("FsrecReadSectors(DeviceObject %x, DiskSector %d, Buffer %x)\n",
68 DeviceObject
, DiskSector
, Buffer
);
69 DPRINT("Offset %I64x BlockSize %ld\n",
73 DPRINT("Building synchronous FSD Request...\n");
74 Irp
= IoBuildSynchronousFsdRequest(IRP_MJ_READ
,
83 DPRINT("IoBuildSynchronousFsdRequest failed\n");
85 return(STATUS_INSUFFICIENT_RESOURCES
);
88 DPRINT("Calling IO Driver... with irp %x\n", Irp
);
89 Status
= IoCallDriver(DeviceObject
, Irp
);
90 if (Status
== STATUS_PENDING
)
92 DPRINT("Operation pending\n");
93 KeWaitForSingleObject(Event
, Suspended
, KernelMode
, FALSE
, NULL
);
94 Status
= IoStatus
.Status
;
99 return(STATUS_SUCCESS
);
104 FsRecDeviceIoControl(IN PDEVICE_OBJECT DeviceObject
,
105 IN ULONG ControlCode
,
106 IN PVOID InputBuffer
,
107 IN ULONG InputBufferSize
,
108 IN OUT PVOID OutputBuffer
,
109 IN OUT PULONG OutputBufferSize
)
111 ULONG BufferSize
= 0;
114 IO_STATUS_BLOCK IoStatus
;
117 if (OutputBufferSize
!= NULL
)
119 BufferSize
= *OutputBufferSize
;
122 Event
= ExAllocatePool(NonPagedPool
, sizeof(KEVENT
));
125 return(STATUS_INSUFFICIENT_RESOURCES
);
128 KeInitializeEvent(Event
, NotificationEvent
, FALSE
);
130 DPRINT("Building device I/O control request ...\n");
131 Irp
= IoBuildDeviceIoControlRequest(ControlCode
,
142 DPRINT("IoBuildDeviceIoControlRequest() failed\n");
144 return(STATUS_INSUFFICIENT_RESOURCES
);
147 DPRINT("Calling IO Driver... with irp %x\n", Irp
);
148 Status
= IoCallDriver(DeviceObject
, Irp
);
149 if (Status
== STATUS_PENDING
)
151 KeWaitForSingleObject(Event
, Suspended
, KernelMode
, FALSE
, NULL
);
152 Status
= IoStatus
.Status
;
155 if (OutputBufferSize
!= NULL
)
157 *OutputBufferSize
= IoStatus
.Information
;