@@ -84,12 +84,12 @@ using namespace streams::details;
84
84
// / </remarks>
85
85
struct EXTENDED_OVERLAPPED : OVERLAPPED
86
86
{
87
- EXTENDED_OVERLAPPED (LPOVERLAPPED_COMPLETION_ROUTINE func) : data( nullptr ), func(func)
87
+ EXTENDED_OVERLAPPED (LPOVERLAPPED_COMPLETION_ROUTINE func, streams::details::_filestream_callback *cb ) : callback(cb ), func(func)
88
88
{
89
89
ZeroMemory (this , sizeof (OVERLAPPED));
90
90
}
91
91
92
- void *data ;
92
+ streams::details::_filestream_callback *callback ;
93
93
LPOVERLAPPED_COMPLETION_ROUTINE func;
94
94
};
95
95
@@ -99,7 +99,7 @@ void CALLBACK IoCompletionCallback(
99
99
DWORD dwNumberOfBytesTransfered,
100
100
LPOVERLAPPED pOverlapped)
101
101
{
102
- EXTENDED_OVERLAPPED *pExtOverlapped = ( EXTENDED_OVERLAPPED *) pOverlapped;
102
+ EXTENDED_OVERLAPPED *pExtOverlapped = static_cast < EXTENDED_OVERLAPPED *>( pOverlapped) ;
103
103
104
104
// //If dwErrorCode is 0xc0000011, it means STATUS_END_OF_FILE.
105
105
// //Map this error code to system error code:ERROR_HANDLE_EOF
@@ -331,14 +331,13 @@ VOID CALLBACK _WriteFileCompletionRoutine(DWORD dwErrorCode, DWORD dwNumberOfByt
331
331
{
332
332
EXTENDED_OVERLAPPED* pOverlapped = static_cast <EXTENDED_OVERLAPPED *>(lpOverlapped);
333
333
334
- auto callback = static_cast <streams::details::_filestream_callback *>(pOverlapped->data );
335
334
if (dwErrorCode != ERROR_SUCCESS && dwErrorCode != ERROR_HANDLE_EOF)
336
335
{
337
- callback->on_error (std::make_exception_ptr (utility::details::create_system_error (dwErrorCode)));
336
+ pOverlapped-> callback ->on_error (std::make_exception_ptr (utility::details::create_system_error (dwErrorCode)));
338
337
}
339
338
else
340
339
{
341
- callback->on_completed (static_cast <size_t >(dwNumberOfBytesTransfered));
340
+ pOverlapped-> callback ->on_completed (static_cast <size_t >(dwNumberOfBytesTransfered));
342
341
}
343
342
}
344
343
@@ -353,15 +352,13 @@ VOID CALLBACK _ReadFileCompletionRoutine(DWORD dwErrorCode, DWORD dwNumberOfByte
353
352
{
354
353
EXTENDED_OVERLAPPED* pOverlapped = static_cast <EXTENDED_OVERLAPPED *>(lpOverlapped);
355
354
356
- auto callback = reinterpret_cast <streams::details::_filestream_callback *>(pOverlapped->data );
357
-
358
355
if (dwErrorCode != ERROR_SUCCESS && dwErrorCode != ERROR_HANDLE_EOF)
359
356
{
360
- callback->on_error (std::make_exception_ptr (utility::details::create_system_error (dwErrorCode)));
357
+ pOverlapped-> callback ->on_error (std::make_exception_ptr (utility::details::create_system_error (dwErrorCode)));
361
358
}
362
359
else
363
360
{
364
- callback->on_completed (static_cast <size_t >(dwNumberOfBytesTransfered));
361
+ pOverlapped-> callback ->on_completed (static_cast <size_t >(dwNumberOfBytesTransfered));
365
362
}
366
363
}
367
364
@@ -375,7 +372,7 @@ VOID CALLBACK _ReadFileCompletionRoutine(DWORD dwErrorCode, DWORD dwNumberOfByte
375
372
// / <returns>0 if the write request is still outstanding, -1 if the request failed, otherwise the size of the data written</returns>
376
373
size_t _write_file_async (_In_ streams::details::_file_info_impl *fInfo , _In_ streams::details::_filestream_callback *callback, const void *ptr, size_t count, size_t position)
377
374
{
378
- auto pOverlapped = new EXTENDED_OVERLAPPED (_WriteFileCompletionRoutine<streams::details::_file_info_impl>);
375
+ auto pOverlapped = new EXTENDED_OVERLAPPED (_WriteFileCompletionRoutine<streams::details::_file_info_impl>, callback );
379
376
380
377
if (position == static_cast <size_t >(-1 ))
381
378
{
@@ -392,8 +389,6 @@ size_t _write_file_async(_In_ streams::details::_file_info_impl *fInfo, _In_ str
392
389
#endif
393
390
}
394
391
395
- pOverlapped->data = callback;
396
-
397
392
#if _WIN32_WINNT >= _WIN32_WINNT_VISTA
398
393
StartThreadpoolIo (static_cast <PTP_IO>(fInfo ->m_io_context ));
399
394
@@ -463,14 +458,13 @@ size_t _write_file_async(_In_ streams::details::_file_info_impl *fInfo, _In_ str
463
458
// / <returns>0 if the read request is still outstanding, -1 if the request failed, otherwise the size of the data read into the buffer</returns>
464
459
size_t _read_file_async (_In_ streams::details::_file_info_impl *fInfo , _In_ streams::details::_filestream_callback *callback, _Out_writes_ (count) void *ptr, _In_ size_t count, size_t offset)
465
460
{
466
- auto pOverlapped = new EXTENDED_OVERLAPPED (_ReadFileCompletionRoutine<streams::details::_file_info_impl>);
461
+ auto pOverlapped = new EXTENDED_OVERLAPPED (_ReadFileCompletionRoutine<streams::details::_file_info_impl>, callback );
467
462
pOverlapped->Offset = static_cast <DWORD>(offset);
468
463
#ifdef _WIN64
469
464
pOverlapped->OffsetHigh = static_cast <DWORD>(offset >> 32 );
470
465
#else
471
466
pOverlapped->OffsetHigh = 0 ;
472
467
#endif
473
- pOverlapped->data = callback;
474
468
475
469
#if _WIN32_WINNT >= _WIN32_WINNT_VISTA
476
470
StartThreadpoolIo ((PTP_IO)fInfo ->m_io_context );
0 commit comments