Latest post of the previous page:
DrKnS, может быть драйвер действительно выпущен так как описано...но приседание в фар = явный сброс позиции в 0 после открытия, проблему бы решило и на производительности не отразилось.
Latest post of the previous page:
DrKnS, может быть драйвер действительно выпущен так как описано...Интересная теория. Test.c:
Code: Select all
#include <windows.h>
#include <stdio.h>
#define ITERATIONS_NUMBER 100000
#define ITERATIONS_STEP 1000
#define TEST_DATA_LENGTH1 1024
#define TEST_DATA_LENGTH2 (TEST_DATA_LENGTH1/2)
int main(int argc, char **argv) {
int i, j;
HANDLE hand;
DWORD dw;
char FileName[MAX_PATH], Data1[TEST_DATA_LENGTH1], Data2[TEST_DATA_LENGTH2], ReadBuff[(TEST_DATA_LENGTH1+TEST_DATA_LENGTH2)*2];
srand(time(NULL));
for(j=0x86, i=0; i<TEST_DATA_LENGTH1; i++, j=(j>>1)+rand()-1) Data1[i]=j%256;
for(i=0; i<TEST_DATA_LENGTH2; i++, j=(j>>1)+rand()-1) Data2[i]=j%256;
for(i=0; i<ITERATIONS_NUMBER; i++) {
sprintf(FileName, "Test_File_%u.bin", rand());
if ((hand=CreateFile(FileName, GENERIC_WRITE, FILE_SHARE_READ, NULL, CREATE_NEW,
FILE_ATTRIBUTE_NORMAL|FILE_ATTRIBUTE_ARCHIVE, NULL))==INVALID_HANDLE_VALUE) {
printf("Can't create file %s, err %d\n", FileName, GetLastError()); continue;
}
if (!WriteFile(hand, Data1, TEST_DATA_LENGTH1, &dw, NULL)||dw!=TEST_DATA_LENGTH1) printf("%s write error: %d bytes written, err %d\n", FileName, dw, GetLastError());
if (!CloseHandle(hand)) printf("Close %s, err %d\n", FileName, GetLastError());
if ((hand=CreateFile(FileName, GENERIC_WRITE, FILE_SHARE_READ, NULL, CREATE_NEW|TRUNCATE_EXISTING,
FILE_ATTRIBUTE_NORMAL|FILE_ATTRIBUTE_ARCHIVE, NULL))==INVALID_HANDLE_VALUE) {
printf("Can't truncate file %s, err %d\n", FileName, GetLastError()); continue;
}
if (!WriteFile(hand, Data2, TEST_DATA_LENGTH2, &dw, NULL)||dw!=TEST_DATA_LENGTH2) printf("%s rewrite error: %d bytes written, err %d\n", FileName, dw, GetLastError());
if (!CloseHandle(hand)) printf("Close %s, err %d\n", FileName, GetLastError());
if ((hand=CreateFile(FileName, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL|FILE_ATTRIBUTE_ARCHIVE, NULL))==INVALID_HANDLE_VALUE) {
printf("Can't open file %s, err %d\n", FileName, GetLastError()); continue;
}
if (!ReadFile(hand, ReadBuff, sizeof(ReadBuff), &dw, NULL)||dw!=TEST_DATA_LENGTH2||memcmp(ReadBuff,Data2,dw)) printf("%s check failed: %d bytes readed, err %d\n", FileName, dw, GetLastError());
if (!CloseHandle(hand)) printf("Close %s, err %d\n", FileName, GetLastError());
if (!DeleteFile(FileName)) printf("%s remove error, err %d\n", FileName, GetLastError());
if (i%ITERATIONS_STEP==0) printf("\r%d...", i);
}
printf("Completed.\n");
return 0;
}
Code: Select all
T:\z>T:\z\test.exe
99000...
Completed.
T:\z>
CreateFile function:
Выделение моё.dwCreationDisposition [in]
This parameter must be one of the following values, which cannot be combined:
Вы бы попустились, вам помочь хотят.
выглядит странно, но тем не менее
CREATE_NEW|TRUNCATE_EXISTING = 1 | 5 = 5 = TRUNCATE_EXISTING
с этим полностью согласен.
А еще я там signed char заполняю остатком от деления на 256 - это тоже жуткий косяк. Вы msdn по CreateFile откройте, и посмотрите на константы, подумайте. Да, это плохая практика, но на работоспособность теста, написанного на коленке за 2 минуты - вполне допустимо, мне так понятнее, потому что это прямая аналогия с _O_CREAT|_O_TRUNC, на вин-апи я уже давно не пишу, только когда припрет.DrKnS wrote: ↑Sun 16 Jul, 2017 13:09Выделение моё.
Многим тут посоветовал бы. Может, был не прав, извиняюсь, но я пришел обсудить глюки, что характерно, стабильно повторяющиеся глюки. Ситуация - мечта разработчика, бери да лови. При этом, почитайте адресованные мне ответы. Да, может слишком эмоционально воспринял, потому что тут и так на взводе эти дни. Еще раз извиняюсь.DrKnS wrote: ↑Sun 16 Jul, 2017 13:09Вы бы попустились, вам помочь хотят.
Стабильно повторяющиеся, заметьте, у вас одного.
По сути - у вас есть исходный код, есть компилятор и умение им пользоваться. Поставьте сюда breakpoint и расскажите нам, что там происходит.
Респект за имитацию сценария, я поленился. А надо было. Результат - всегда "ок", при этом, если в начале, перед запуском, файла test_Far_Overwrit.txt нет - тогда он появляется кривой, с нулями. Всегда. Если файл перед запуском теста есть - тогда все ок. Это жесть. Флаги FILE_FLAG_SEQUENTIAL_SCAN | FILE_FLAG_BACKUP_SEMANTICS | FILE_FLAG_POSIX_SEMANTICS - все убирал (семантику убирал с подстановкой имени на обычное) - не во флагах дело.
Может пригодиться это сообщение: viewtopic.php?p=144607#p144607, да и тема в целом. Если понадобится обсуждать сборку, то там самое место.
Спасибо, уже пересобрал (попробовал еще icl v17 собрать - я штатно icl пользуюсь с древних лет- с ходу не вышло, потом посмотрю).
Дааа, убил полдня чтобы найти причину, оказалось - Acronis Active Protection (TM) Service.
В краткосрочной перспективе - да. У пользователей акрониса будет меньше испорченных файлов, а у нас меньше левых багрепортов.