@@ -278,24 +278,20 @@ static DWORD SpdStorageUnitHandleTransactPipe(HANDLE Handle,
278
278
UINT32 Btl ,
279
279
SPD_IOCTL_TRANSACT_RSP * Rsp ,
280
280
SPD_IOCTL_TRANSACT_REQ * Req ,
281
- PVOID DataBuffer )
281
+ PVOID DataBuffer ,
282
+ OVERLAPPED * Overlapped )
282
283
{
283
284
STORAGE_UNIT * StorageUnit = Handle ;
284
285
LONG Connected ;
285
286
ULONG DataLength ;
286
287
TRANSACT_MSG * Msg = 0 ;
287
- OVERLAPPED Overlapped ;
288
288
DWORD BytesTransferred ;
289
289
DWORD Error ;
290
290
291
291
if ((0 == Req && 0 == Rsp ) ||
292
292
(0 != Req && 0 == DataBuffer ))
293
293
return ERROR_INVALID_PARAMETER ;
294
294
295
- Error = SpdOverlappedInit (& Overlapped );
296
- if (ERROR_SUCCESS != Error )
297
- goto exit ;
298
-
299
295
AcquireSRWLockShared (& StorageUnitLock );
300
296
Error = StorageUnit == StorageUnits [SPD_INDEX_FROM_BTL (Btl )] ?
301
297
ERROR_SUCCESS : ERROR_FILE_NOT_FOUND ;
@@ -316,16 +312,16 @@ static DWORD SpdStorageUnitHandleTransactPipe(HANDLE Handle,
316
312
{
317
313
Error = WaitOverlappedResult (
318
314
StorageUnit -> Event ,
319
- ConnectNamedPipe (StorageUnit -> Pipe , & Overlapped ),
320
- StorageUnit -> Pipe , & Overlapped , & BytesTransferred );
315
+ ConnectNamedPipe (StorageUnit -> Pipe , Overlapped ),
316
+ StorageUnit -> Pipe , Overlapped , & BytesTransferred );
321
317
if (ERROR_SUCCESS == Error || ERROR_PIPE_CONNECTED == Error )
322
318
{
323
319
Error = WaitOverlappedResult (
324
320
StorageUnit -> Event ,
325
321
WriteFile (StorageUnit -> Pipe ,
326
322
& StorageUnit -> StorageUnitParams , sizeof StorageUnit -> StorageUnitParams ,
327
- 0 , & Overlapped ),
328
- StorageUnit -> Pipe , & Overlapped , & BytesTransferred );
323
+ 0 , Overlapped ),
324
+ StorageUnit -> Pipe , Overlapped , & BytesTransferred );
329
325
if (ERROR_SUCCESS == Error )
330
326
{
331
327
StorageUnit -> Connected = - StorageUnit -> Connected ;
@@ -354,8 +350,8 @@ static DWORD SpdStorageUnitHandleTransactPipe(HANDLE Handle,
354
350
memcpy (Msg + 1 , DataBuffer , DataLength );
355
351
Error = WaitOverlappedResult (
356
352
StorageUnit -> Event ,
357
- WriteFile (StorageUnit -> Pipe , Msg , sizeof (TRANSACT_MSG ) + DataLength , 0 , & Overlapped ),
358
- StorageUnit -> Pipe , & Overlapped , & BytesTransferred );
353
+ WriteFile (StorageUnit -> Pipe , Msg , sizeof (TRANSACT_MSG ) + DataLength , 0 , Overlapped ),
354
+ StorageUnit -> Pipe , Overlapped , & BytesTransferred );
359
355
if (ERROR_SUCCESS != Error )
360
356
goto disconnect ;
361
357
}
@@ -365,8 +361,8 @@ static DWORD SpdStorageUnitHandleTransactPipe(HANDLE Handle,
365
361
Error = WaitOverlappedResult (
366
362
StorageUnit -> Event ,
367
363
ReadFile (StorageUnit -> Pipe ,
368
- Msg , sizeof (TRANSACT_MSG ) + StorageUnit -> StorageUnitParams .MaxTransferLength , 0 , & Overlapped ),
369
- StorageUnit -> Pipe , & Overlapped , & BytesTransferred );
364
+ Msg , sizeof (TRANSACT_MSG ) + StorageUnit -> StorageUnitParams .MaxTransferLength , 0 , Overlapped ),
365
+ StorageUnit -> Pipe , Overlapped , & BytesTransferred );
370
366
if (ERROR_SUCCESS != Error )
371
367
goto disconnect ;
372
368
@@ -418,8 +414,6 @@ static DWORD SpdStorageUnitHandleTransactPipe(HANDLE Handle,
418
414
exit :
419
415
MemFree (Msg );
420
416
421
- SpdOverlappedFini (& Overlapped );
422
-
423
417
return Error ;
424
418
425
419
disconnect :
@@ -544,12 +538,29 @@ DWORD SpdStorageUnitHandleTransact(HANDLE Handle,
544
538
UINT32 Btl ,
545
539
SPD_IOCTL_TRANSACT_RSP * Rsp ,
546
540
SPD_IOCTL_TRANSACT_REQ * Req ,
547
- PVOID DataBuffer )
541
+ PVOID DataBuffer ,
542
+ OVERLAPPED * Overlapped )
548
543
{
544
+ OVERLAPPED TempOverlapped = { 0 };
545
+ DWORD Error ;
546
+
547
+ if (Overlapped == NULL )
548
+ {
549
+ Error = SpdOverlappedInit (& TempOverlapped );
550
+ if (ERROR_SUCCESS != Error )
551
+ return Error ;
552
+
553
+ Overlapped = & TempOverlapped ;
554
+ }
555
+
549
556
if (IsPipeHandle (Handle ))
550
- return SpdStorageUnitHandleTransactPipe (GetPipeHandle (Handle ), Btl , Rsp , Req , DataBuffer );
557
+ Error = SpdStorageUnitHandleTransactPipe (GetPipeHandle (Handle ), Btl , Rsp , Req , DataBuffer , Overlapped );
551
558
else
552
- return SpdIoctlTransact (GetDeviceHandle (Handle ), Btl , Rsp , Req , DataBuffer );
559
+ Error = SpdIoctlTransact (GetDeviceHandle (Handle ), Btl , Rsp , Req , DataBuffer , Overlapped );
560
+
561
+ SpdOverlappedFini (& TempOverlapped );
562
+
563
+ return Error ;
553
564
}
554
565
555
566
DWORD SpdStorageUnitHandleShutdown (HANDLE Handle ,
0 commit comments