На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
Обратите внимание:
1. Прежде чем начать новую тему или отправить сообщение, убедитесь, что вы не нарушаете правил форума!
2. Обязательно воспользуйтесь поиском. Возможно, Ваш вопрос уже обсуждали. Полезные ссылки приведены ниже.
3. Темы с просьбой выполнить какую-либо работу за автора в этом разделе не обсуждаются.
4. Используйте теги [ code=cpp ] ...текст программы... [ /code ] для выделения текста программы подсветкой.
5. Помните, здесь телепатов нет. Старайтесь формулировать свой вопрос максимально грамотно и чётко: Как правильно задавать вопросы
6. Запрещено отвечать в темы месячной и более давности без веских на то причин.

Полезные ссылки:
user posted image FAQ Сайта (C++) user posted image FAQ Форума user posted image Наши Исходники user posted image Поиск по Разделу user posted image MSDN Library Online (Windows Driver Kit) user posted image Google

Ваше мнение о модераторах: user posted image B.V.
Модераторы: B.V.
Страницы: (2) [1] 2  все  ( Перейти к последнему сообщению )  
> Win 10 и ReadFileEx
    Странное поведение ReadFileEx в Win 10
    не находит конец файла
    ниже приведён код тестового приложения
    ExpandedWrap disabled
      // temp.cpp : Defines the entry point for the console application.
      //
       
      #include "stdafx.h"
      #include <windows.h>
      #include <stdio.h>
       
      #define BUFSIZE 4096
       
      VOID CALLBACK __IOCompletionRoutine( DWORD dwErrorCode, DWORD dwSize, LPOVERLAPPED lpOverlapped )
      {
          printf("__IOCompletionRoutine\n");
      };
          int _tmain(int argc, _TCHAR* argv[])
      {
          OVERLAPPED temp;
          temp.hEvent = 0;
          temp.Internal = 0;
          temp.InternalHigh = 0;
          temp.Offset = 0;
          temp.OffsetHigh = 0;
          byte buffer [BUFSIZE] = {0};
          // Открываем файл
          HANDLE m_hFile = CreateFileW(
              L"C:\\test.test",
              GENERIC_READ | GENERIC_WRITE,
              FILE_SHARE_READ,
              NULL,
              OPEN_EXISTING,
              FILE_ATTRIBUTE_NORMAL |
                  FILE_FLAG_NO_BUFFERING |
                  FILE_FLAG_OVERLAPPED |
                  FILE_FLAG_WRITE_THROUGH |
                  FILE_FLAG_RANDOM_ACCESS,
              NULL
          );
          
          DWORD res = ReadFileEx(m_hFile, buffer, BUFSIZ, &temp, &__IOCompletionRoutine);
          SleepEx(5000, TRUE);
          printf("ReadFileEx- %d\n", res);
          DWORD error = GetLastError();
          printf("error- %d\n", error);
          /*for(int i=0; i< BUFSIZ; i++)
              printf("%d ", buffer[i]);
          printf("\n");*/
          temp.Offset = BUFSIZE;
          memset(buffer,0, BUFSIZ);
          res = ReadFileEx(m_hFile, buffer, BUFSIZ, &temp, &__IOCompletionRoutine);
          SleepEx(5000, TRUE);
          printf("ReadFileEx- %d\n", res);
          error = GetLastError();
          printf("error- %d\n", error);
          /*for(int i=0; i< BUFSIZ; i++)
              printf("%d ", buffer[i]);
          printf("\n");*/
          Sleep(60000);
          return 0;
      }

    файл test.test ровно 4 килобайта[attach=#0][/attach].
    на ОС до Win 10 При второй попытки чтения возвращается код ошибки 0 и LastError (38)
    а под Win 10 Всегда возвращается 1 и 0 соответственно. получаем без конечный файл на чтение. что не есть хорошо
    может кто сталкивался с такой проблемой?
    и под Win10 оно не ждёт 5 секунда а сразу выводит резултаты.
    Сообщение отредактировано: nik531 -
      nik531
      У тебя же OVERLAPPED I/O, надо все коды ошибок смотреть внутри IOCOmpletionRoutine, а не сразу после вызова ReadFileEx. Он вернул 0 - значит, ошибки по запуску операции чтения не было, а вот ее результат ты узнаешь уже в IOCOmpletionRoutine.
          но почему в разных ОС поведении разное. и даже Sleep себя по разному ведёт. и до появления win 10 всё стабильно работало 10 лет :(
          и даже вот тут написанно http://www.vsokovikov.narod.ru/New_MSDN_AP..._readfileex.htm что должно возвращать 0:( вопщем в майкросфоте негодяии. Пришли и передлали всё по совему. А программка 10 лет стабильно работала :(

          Добавлено
          если добавить в конце проверку GetOverlappedResult то тогда конец файла находится и это хорошо
          ExpandedWrap disabled
                DWORD nBytesRead = 0;
                GetOverlappedResult(m_hFile, &temp, &nBytesRead, FALSE);
                error = GetLastError();
                printf("error over- %d\n", error);
            Цитата nik531 @
            и даже вот тут написанно http://www.vsokovikov.narod.ru/New_MSDN_AP..._readfileex.htm что должно возвращать 0:( вопщем в майкросфоте негодяии. Пришли и передлали всё по совему. А программка 10 лет стабильно работала :(

            она и в 10ке возвращает 0 :whistle:
              Цитата nik531 @
              но почему в разных ОС поведении разное. и даже Sleep себя по разному ведёт. и до появления win 10 всё стабильно работало 10 лет

              А не надо надеяться на недокументированное поведение, которое может поменяться не только при смене ОС, но даже после обычного патча или установки антивируса например. Раньше у тебя она сразу возвращала 0 (то есть ошибку, как написано в MSDN для этой функции), и код ошибки 38 - конец файла. А теперь возвращает 1, то есть была успешно запущена асинхронная операция: "If the function succeeds, the calling thread has an asynchronous I/O operation pending: the overlapped read operation from the file. When this I/O operation completes, and the calling thread is blocked in an alertable wait state, the system calls the function pointed to by lpCompletionRoutine, and the wait state completes with a return code of WAIT_IO_COMPLETION.", и код ошибки 38 ты уже получишь в IOCompletionRoutine. Что она вернет в каждом конкретном случае - не документировано, но все варианты в MSDN описаны, и их надо обрабатывать.
                старик зачем тут sleep? что за костыли? :wacko:
                  не всё оказалась так просто. GetOverlappedResul иногда возвращает явно 38 код ошибки хотя конца файла ещё не достиг. Пока не понял почему так происходит.
                  Обрабатывать код ошибка в __IOCompletionRoutine тоже как-то не понятно. в Win7 для последнего блока она не вызывается. Вопщем пока склоняюсь к тому чтобы проверять код ошибки в двух местах при вызове и ReadFileEx и внутри __IOCompletionRoutine и отказаться от GetOverlappedResult.
                  хотя в MSDN написано
                  If ReadFileEx attempts to read past the end-of-file (EOF), the call to GetOverlappedResult for that operation returns FALSE and GetLastError returns ERROR_HANDLE_EOF.
                    Цитата nik531 @
                    пока склоняюсь к тому чтобы проверять код ошибки в двух местах при вызове и ReadFileEx и внутри __IOCompletionRoutine

                    Это и есть единственный правильный вариант.
                      Цитата nik531 @
                      If ReadFileEx attempts to read past the end-of-file (EOF), the call to GetOverlappedResult for that operation returns FALSE and GetLastError returns ERROR_HANDLE_EOF.

                      а как тогда понимать вот эту строчку с мсдн ?
                        посмотрел я MSDN для VS 2008 там на чистом буржуйском написанно
                        If ReadFileEx attempts to read past the end of the file, the function returns zero, and GetLastError returns ERROR_HANDLE_EOF.
                        в MSDN для текущей версии это звучит так
                        If ReadFileEx attempts to read past the end-of-file (EOF), the call to GetOverlappedResult for that operation returns FALSE and GetLastError returns ERROR_HANDLE_EOF.
                        то есть эти люди с майкрософта поменяли поведение базовой функции. так мало того что поменяли так они сделали это ещё с ошибкой, GetOverlappedResult иногда возвращает ERROR_HANDLE_EOF хотя файл читается с начала и до конца ещё далеко.
                        пока проверка в двух местах спасает :) посмотрим далее.
                          Цитата nik531 @
                          то есть эти люди с майкрософта поменяли поведение базовой функции. так мало того что поменяли так они сделали это ещё с ошибкой, GetOverlappedResult иногда возвращает ERROR_HANDLE_EOF хотя файл читается с начала и до конца ещё далеко.

                          нет мля они тебя забыли спросить :D
                          и как така ошибка? то что ты не правильно юзаешь ее и не умеешь читать на буржуйском не значит что там ошибка :whistle:
                            Цитата nik531 @
                            GetOverlappedResult иногда возвращает ERROR_HANDLE_EOF хотя файл читается с начала и до конца ещё далеко.

                            Неправильно используешь overlapped I/O. Весь код покажи, в котором у тебя такая ошибка.
                              ExpandedWrap disabled
                                HRESULTRead( LPVOID pBuffer, LPOVERLAPPED lpOverlapped, LPOVERLAPPED_COMPLETION_ROUTINE pIOCompletionRoutine )
                                {
                                    // Вызываем соответствующую функцию WinAPI
                                    BOOL bResult = ReadFileEx(
                                        m_hFile,
                                        pBuffer,
                                        m_dwPageSize,
                                        lpOverlapped,
                                        pIOCompletionRoutine
                                    );
                                    // Возвращаем результат
                                    if(bResult == TRUE)
                                    {//не спешим радоваться Win 10 вернёт TRUE даже если мы читаем за пределами файла проверим
                                     //В MSDN написано
                                     //If ReadFileEx attempts to read past the end-of-file (EOF), the call to GetOverlappedResult for that operation returns FALSE and GetLastError returns ERROR_HANDLE_EOF.
                                     //будем надеятся что это правда
                                        DWORD nBytesRead = 0;
                                        if((GetOverlappedResult(m_hFile, lpOverlapped, &nBytesRead, FALSE) == FALSE)&&(GetLastError( ) ==  ERROR_HANDLE_EOF))
                                            return HRESULT_FROM_WIN32(ERROR_HANDLE_EOF);
                                    }
                                    return( ( bResult ) ? S_OK : HRESULT_FROM_WIN32( GetLastError( ) ) );
                                }

                              и вот return HRESULT_FROM_WIN32(ERROR_HANDLE_EOF); происходит при начале чтения файла. lpOverlapped смешение равно ноль. файл большего размера чем буфер.
                              Цитата

                              нет мля они тебя забыли спросить

                              разработчик делал всё по документации. Будет любезны поддерживать то что за документировали.
                              Сообщение отредактировано: nik531 -
                                Цитата nik531 @
                                разработчик делал всё по документации. Будет любезны поддерживать то что за документировали.

                                какой такой документации? документации для какой винды? 10ки? 8?
                                и вы будте любезны юзать ее там для какой платформы они ее разработали :whistle:

                                Добавлено
                                ты вообще читал ее описание? вот почитай
                                https://msdn.microsoft.com/ru-ru/library/windows/desktop/aa365468(v=vs.85).aspx
                                0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                                0 пользователей:


                                Рейтинг@Mail.ru
                                [ Script execution time: 0,0401 ]   [ 16 queries used ]   [ Generated: 26.04.24, 21:06 GMT ]