EaseFilter Demo Project
UnitTest.cpp
Go to the documentation of this file.
1 //
3 // (C) Copyright 2011 EaseFilter Technologies Inc.
4 // All Rights Reserved
5 //
6 // This software is part of a licensed software product and may
7 // only be used or copied in accordance with the terms of that license.
8 //
10 
11 #include "stdafx.h"
12 #include "Tools.h"
13 #include "UnitTest.h"
14 
15 #define MAX_ERROR_MESSAGE_SIZE 1024
16 
17 static WCHAR* testFolder = L"c:\\filterTest";
18 static WCHAR* filterMask = L"c:\\filterTest\\*";
19 static WCHAR* testFile = L"c:\\filterTest\\myTestFile.txt";
20 static WCHAR* reparseFolder = L"c:\\reparse";
21 static WCHAR* reparseMask = L"c:\\reparse\\*";
22 static WCHAR* reparseFile = L"c:\\reparse\\myTestFile.txt";
23 static CHAR* testData = "EaseFilter Test Data for read/write,This is the original data when we setup a new test file.\n For callback filter read/write test,It will modify this data";
24 static CHAR* replaceData = "This replace data test,it is not in the file.It will replace/merge the original data";
25 static CHAR* reparseData = "EaseFilter Test Data for reparse open,this is the data from reparse file open.";
26 static LONGLONG testFileSize = 2147483648; //2 GB;
27 
28 
29 BOOL
30 IsTestFile(WCHAR* fileName,ULONG fileNameLength )
31 {
32  if( _wcsnicmp(testFile,fileName,wcslen(testFile)) == 0)
33  {
34  return TRUE;
35  }
36  else
37  {
38  return FALSE;
39  }
40 }
41 
42 BOOL
43 IsTestFolder(WCHAR* fileName )
44 {
45  if( _wcsnicmp(testFolder,fileName,wcslen(testFolder)) == 0)
46  {
47  return TRUE;
48  }
49  else
50  {
51  return FALSE;
52  }
53 }
54 
55 WCHAR*
57 {
58  return filterMask;
59 }
60 
61 WCHAR*
63 {
64  return reparseFile;
65 }
66 
67 CHAR*
69 {
70  return replaceData;
71 }
72 
73 LONGLONG
75 {
76  return testFileSize;
77 }
78 
79 LARGE_INTEGER
81 {
82  SYSTEMTIME st;
83  FILETIME fileTime;
84  GetSystemTime(&st);
85 
86  /*printf("Current SystemTime: Year:%d Month:%d Day:%d Hour:%d Min:%d Second:% d\n"
87  ,st.wYear,st.wMonth,st.wDay,st.wHour,st.wMinute,st.wSecond);*/
88 
89  //set the test file time to 2011/11/11
90  st.wYear = 2011;
91  st.wMonth = 11;
92  st.wDay = 11;
93  st.wHour = 11;
94  st.wMinute = 11;
95  st.wSecond = 11;
96  st.wMilliseconds = 11;
97 
98  SystemTimeToFileTime(&st,&fileTime);
99 
100  LARGE_INTEGER large;
101  large.LowPart=fileTime.dwLowDateTime;
102  large.HighPart=fileTime.dwHighDateTime;
103 
104  return large;
105 }
106 
107 BOOL
108 CreateTestFile(WCHAR* folder,WCHAR* fileName,CHAR* data)
109 {
110  LARGE_INTEGER ByteOffset = {0};
111  OVERLAPPED Overlapped = {0};
112  DWORD dwTransferred = 0;
113  DWORD Length = 0;
114  int nError = ERROR_SUCCESS;
115  BOOL ret = FALSE;
116 
117  //Create the test folder.
118  ret = CreateDirectory(folder,NULL);
119 
120  if( ret == 0 )
121  {
122  nError = GetLastError();
123  if( nError != ERROR_ALREADY_EXISTS )
124  {
125  PrintErrorMessage(L"Create test folder failed.", nError);
126  return FALSE;
127  }
128  }
129 
130  //Remove readOnly attribue if it exist.
131  SetFileAttributes(fileName,FILE_ATTRIBUTE_NORMAL);
132 
133  //Create the test file,if it exist, overwrite it.
134  HANDLE pFile = CreateFile(fileName,GENERIC_WRITE,NULL,NULL,CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL,NULL);
135 
136  if( pFile == INVALID_HANDLE_VALUE )
137  {
138  PrintErrorMessage(L"Create test file failed.", GetLastError());
139  return FALSE;
140  }
141 
142  Length = (DWORD)strlen(data);
143 
144  // Write test data to the test file.
145  if(!WriteFile(pFile, data, Length, &dwTransferred, NULL))
146  {
147  nError = GetLastError();
148  PrintErrorMessage(L"WriteFile failed.", nError);
149  ret = FALSE;
150  goto EXIT;
151  }
152 
153  ret = TRUE;
154 
155 EXIT:
156 
157  CloseHandle(pFile);
158 
159  return ret;
160 
161 }
162 
163 BOOL
165 {
166  BOOL ret = CreateTestFile(testFolder,testFile,testData);
167 
168  if(!ret)
169  {
170  return ret;
171  }
172 
173  ret = CreateTestFile(reparseFolder,reparseFile,reparseData);
174 
175  return ret;
176 }
177 
178 BOOL
180 {
181  BOOL ret = FALSE;
182  CHAR buffer[4096];
183  ULONG bufferLength = sizeof(buffer);
184  HANDLE pFile = INVALID_HANDLE_VALUE;
185  ULONG accessFlag = 0;
186  DWORD dwError = 0;
187 
188  //after the processes open the managed files, it then can't create the new files till the processes terminated.
190 
191  //this only when the include process names or process Ids list is not empty,
192  //then after the include processes open the managed files, it then can't create the new files till the processes terminated.
193  //accessFlag = (~ALLOW_INCLUDE_PROCESS_SAVE_AS)&ALLOW_MAX_RIGHT_ACCESS;
194 
195  AddNewFilterRule(accessFlag,filterMask);
196 
197  pFile = CreateFile(testFile,GENERIC_WRITE,NULL,NULL,CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL,NULL);
198  if( INVALID_HANDLE_VALUE != pFile )
199  {
200  PrintErrorMessage(L"ALLOW_ALL_SAVE_AS test failed.",0);
201  ret = FALSE;
202  goto EXIT;
203  }
204  else
205  {
206  dwError = GetLastError();
207 
208  if( ERROR_ACCESS_DENIED != dwError )
209  {
210  PrintErrorMessage(L"ALLOW_ALL_SAVE_AS test failed.",dwError);
211  ret = FALSE;
212  goto EXIT;
213  }
214 
215  PrintPassedMessage(L"ALLOW_ALL_SAVE_AS test passed.\n");
216  }
217 
218  //we need to remove the current process Id from the block save as list, or the current process can't create the new file.
219  if(!RemoveBlockSaveAsProcessId(GetCurrentProcessId()))
220  {
221  PrintLastErrorMessage(L"RemoveBlockSaveAsProcessId failed.");
222  ret = FALSE;
223  goto EXIT;
224  }
225 
226 
227  //Test Remove ALLOW_OPEN_WTIH_ACCESS_SYSTEM_SECURITY
229  AddNewFilterRule(accessFlag,filterMask);
230 
231  pFile = CreateFile(testFile,ACCESS_SYSTEM_SECURITY,NULL,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);
232  if( INVALID_HANDLE_VALUE != pFile )
233  {
234  PrintErrorMessage(L"ALLOW_OPEN_WTIH_ACCESS_SYSTEM_SECURITY test failed.",0);
235  ret = FALSE;
236  goto EXIT;
237  }
238  else
239  {
240  dwError = GetLastError();
241 
242  if( ERROR_ACCESS_DENIED != dwError )
243  {
244  PrintErrorMessage(L"ALLOW_OPEN_WTIH_ACCESS_SYSTEM_SECURITY test failed.",dwError);
245  ret = FALSE;
246  goto EXIT;
247  }
248 
249  PrintPassedMessage(L"ALLOW_OPEN_WTIH_ACCESS_SYSTEM_SECURITY test passed.\n");
250  }
251 
252 
253  //Test Remove ALLOW_OPEN_WITH_READ_ACCESS
255  //It will overwrite the previous filter rule, since the filterMask is the same, accessFalg is different.
256  AddNewFilterRule(accessFlag,filterMask);
257 
258  pFile = CreateFile(testFile,GENERIC_READ,NULL,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);
259  if( INVALID_HANDLE_VALUE != pFile )
260  {
261  PrintErrorMessage(L"ALLOW_OPEN_WITH_READ_ACCESS test failed.",0);
262  ret = FALSE;
263  goto EXIT;
264  }
265  else
266  {
267  dwError = GetLastError();
268 
269  if( ERROR_ACCESS_DENIED != dwError )
270  {
271  PrintErrorMessage(L"ALLOW_OPEN_WITH_READ_ACCESS test failed.",dwError);
272  ret = FALSE;
273  goto EXIT;
274  }
275  PrintPassedMessage(L"ALLOW_OPEN_WITH_READ_ACCESS test passed.\n");
276  }
277 
278 
279  //Test Remove ALLOW_OPEN_WITH_WRITE_ACCESS
281  AddNewFilterRule(accessFlag,filterMask);
282 
283  pFile = CreateFile(testFile,GENERIC_WRITE,NULL,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);
284  if( INVALID_HANDLE_VALUE != pFile )
285  {
286  PrintErrorMessage(L"ALLOW_OPEN_WITH_WRITE_ACCESS test failed.",0);
287  ret = FALSE;
288  goto EXIT;
289  }
290  else
291  {
292  dwError = GetLastError();
293 
294  if( ERROR_ACCESS_DENIED != dwError )
295  {
296  PrintErrorMessage(L"ALLOW_OPEN_WITH_WRITE_ACCESS test failed.",dwError);
297  ret = FALSE;
298  goto EXIT;
299  }
300 
301  PrintPassedMessage(L"ALLOW_OPEN_WITH_WRITE_ACCESS test passed.\n");
302  }
303 
304  //Not allow open file with create or overwrite option.
306  AddNewFilterRule(accessFlag,filterMask);
307 
308  pFile = CreateFile(testFile,GENERIC_WRITE,NULL,NULL,CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL,NULL);
309  if( INVALID_HANDLE_VALUE != pFile )
310  {
311  PrintErrorMessage(L"ALLOW_OPEN_WITH_CREATE_OR_OVERWRITE_EXIST_FILE test failed.",0);
312  ret = FALSE;
313  goto EXIT;
314  }
315  else
316  {
317  dwError = GetLastError();
318 
319  if( ERROR_ACCESS_DENIED != dwError )
320  {
321  PrintErrorMessage(L"ALLOW_OPEN_WITH_CREATE_OR_OVERWRITE_EXIST_FILE test failed.",dwError);
322  ret = FALSE;
323  goto EXIT;
324  }
325 
326  PrintPassedMessage(L"ALLOW_OPEN_WITH_CREATE_OR_OVERWRITE_EXIST_FILE test passed.\n");
327  }
328 
329 
330 
331  //Test Remove ALLOW_OPEN_WITH_DELETE_ACCESS.
333  AddNewFilterRule(accessFlag,filterMask);
334 
335  pFile = CreateFile(testFile,DELETE,NULL,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);
336  if( INVALID_HANDLE_VALUE != pFile )
337  {
338  PrintErrorMessage(L"ALLOW_OPEN_WITH_DELETE_ACCESS test failed.",0);
339  ret = FALSE;
340  goto EXIT;
341  }
342  else
343  {
344  dwError = GetLastError();
345 
346  if( ERROR_ACCESS_DENIED != dwError )
347  {
348  PrintErrorMessage(L"ALLOW_OPEN_WITH_DELETE_ACCESS test failed.",dwError);
349  ret = FALSE;
350  goto EXIT;
351  }
352 
353  PrintPassedMessage(L"ALLOW_OPEN_WITH_DELETE_ACCESS test passed.\n");
354  }
355 
356 
357  //Test Remove ALLOW_READ_ACCESS.
358  accessFlag = (~ALLOW_READ_ACCESS) & ALLOW_MAX_RIGHT_ACCESS;
359  AddNewFilterRule(accessFlag,filterMask);
360 
361  pFile = CreateFile(testFile,GENERIC_READ,NULL,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);
362  if( INVALID_HANDLE_VALUE == pFile )
363  {
364  PrintErrorMessage(L"Open test file for read access failed.",GetLastError());
365  ret = FALSE;
366  goto EXIT;
367  }
368 
369  ret = ReadFile(pFile,buffer,bufferLength,&bufferLength,NULL);
370  if(0 != ret)
371  {
372  PrintErrorMessage(L"ALLOW_READ_ACCESS test failed.",0);
373  goto EXIT;
374  }
375  else
376  {
377  dwError = GetLastError();
378 
379  if( ERROR_ACCESS_DENIED != dwError )
380  {
381  PrintErrorMessage(L"ALLOW_READ_ACCESS test failed.",dwError);
382  ret = FALSE;
383  goto EXIT;
384  }
385 
386  PrintPassedMessage(L"ALLOW_READ_ACCESS test passed.\n");
387  CloseHandle(pFile);
388  }
389 
390  //Test Remove ALLOW_WRITE_ACCESS.
391  accessFlag = (~ALLOW_WRITE_ACCESS) & ALLOW_MAX_RIGHT_ACCESS;
392  AddNewFilterRule(accessFlag,filterMask);
393 
394  pFile = CreateFile(testFile,GENERIC_WRITE,NULL,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);
395  if( INVALID_HANDLE_VALUE == pFile )
396  {
397  PrintErrorMessage(L"Open test file for write access failed.",GetLastError());
398  ret = FALSE;
399  goto EXIT;
400  }
401 
402 
403  ret = WriteFile(pFile,buffer,bufferLength,&bufferLength,NULL);
404  if(0 != ret)
405  {
406  PrintErrorMessage(L"ALLOW_WRITE_ACCESS test failed.",0);
407  goto EXIT;
408  }
409  else
410  {
411  dwError = GetLastError();
412 
413  if( ERROR_ACCESS_DENIED != dwError )
414  {
415  PrintErrorMessage(L"ALLOW_WRITE_ACCESS test failed.",dwError);
416  ret = FALSE;
417  goto EXIT;
418  }
419  PrintPassedMessage(L"ALLOW_WRITE_ACCESS test passed.\n");
420  CloseHandle(pFile);
421  }
422 
423 
424  //Test Remove ALLOW_QUERY_INFORMATION_ACCESS.
426  AddNewFilterRule(accessFlag,filterMask);
427 
428  pFile = CreateFile(testFile,GENERIC_READ,NULL,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);
429  if( INVALID_HANDLE_VALUE == pFile )
430  {
431  PrintErrorMessage(L"Open test file for query information failed.",GetLastError());
432  ret = FALSE;
433  goto EXIT;
434  }
435 
436  BY_HANDLE_FILE_INFORMATION fileInfo;
437  ret = GetFileInformationByHandle(pFile,&fileInfo);
438  if(0 != ret)
439  {
440  PrintErrorMessage(L"ALLOW_QUERY_INFORMATION_ACCESS test failed.",0);
441  goto EXIT;
442  }
443  else
444  {
445  dwError = GetLastError();
446 
447  if( ERROR_ACCESS_DENIED != dwError )
448  {
449  PrintErrorMessage(L"ALLOW_QUERY_INFORMATION_ACCESS test failed.",dwError);
450  ret = FALSE;
451  goto EXIT;
452  }
453 
454  PrintPassedMessage(L"ALLOW_QUERY_INFORMATION_ACCESS test passed.\n");
455  CloseHandle(pFile);
456  }
457 
458 
459 
460  //Test Remove ALLOW_SET_INFORMATION.
462  AddNewFilterRule(accessFlag,filterMask);
463 
464  pFile = CreateFile(testFile,GENERIC_ALL,NULL,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);
465  if( INVALID_HANDLE_VALUE == pFile )
466  {
467  PrintErrorMessage(L"Open test file for set information failed.",GetLastError());
468  ret = FALSE;
469  goto EXIT;
470  }
471 
472  //this API only support in windows vista or later version.
473  //ret = SetFileInformationByHandle(pFile,FileBasicInfo,&fileInfo,sizeof(BY_HANDLE_FILE_INFORMATION));
474 
475  //we will test with this API
476  ret = SetFileAttributes(testFile,FILE_ATTRIBUTE_READONLY);
477  if(0 != ret)
478  {
479  PrintErrorMessage(L"ALLOW_SET_INFORMATION test failed.",0);
480  goto EXIT;
481  }
482  else
483  {
484  dwError = GetLastError();
485 
486  if( ERROR_ACCESS_DENIED != dwError )
487  {
488  PrintErrorMessage(L"ALLOW_SET_INFORMATION test failed.",dwError);
489  ret = FALSE;
490  goto EXIT;
491  }
492 
493  PrintPassedMessage(L"ALLOW_SET_INFORMATION test passed.\n");
494  CloseHandle(pFile);
495  }
496 
497  //Test Remove ALLOW_FILE_RENAME.
498  accessFlag = (~ALLOW_FILE_RENAME) & ALLOW_MAX_RIGHT_ACCESS;
499  AddNewFilterRule(accessFlag,filterMask);
500 
501  ret = MoveFile (testFile,L"c:\\TestMoveFileNameFile.txt");
502  if(0 != ret)
503  {
504  PrintErrorMessage(L"ALLOW_FILE_RENAME test failed.",0);
505  goto EXIT;
506  }
507  else
508  {
509  dwError = GetLastError();
510 
511  if( ERROR_ACCESS_DENIED != dwError )
512  {
513  PrintErrorMessage(L"ALLOW_FILE_RENAME test failed.",dwError);
514  ret = FALSE;
515  goto EXIT;
516  }
517 
518  PrintPassedMessage(L"ALLOW_FILE_RENAME test passed.\n");
519  }
520 
521  //Test Remove ALLOW_FILE_DELETE.
522  accessFlag = (~ALLOW_FILE_DELETE) & ALLOW_MAX_RIGHT_ACCESS;
523  AddNewFilterRule(accessFlag,filterMask);
524 
525  ret = DeleteFile(testFile);
526  if(0 != ret)
527  {
528  PrintErrorMessage(L"ALLOW_FILE_DELETE test failed.",0);
529  goto EXIT;
530  }
531  else
532  {
533  dwError = GetLastError();
534 
535  if( ERROR_ACCESS_DENIED != dwError )
536  {
537  PrintErrorMessage(L"ALLOW_FILE_DELETE test failed.",dwError);
538  ret = FALSE;
539  goto EXIT;
540  }
541 
542  PrintPassedMessage(L"ALLOW_FILE_DELETE test passed.\n");
543  }
544 
545  //Test Remove ALLOW_FILE_SIZE_CHANGE.
547  AddNewFilterRule(accessFlag,filterMask);
548 
549  pFile = CreateFile(testFile,GENERIC_ALL,NULL,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);
550  if( INVALID_HANDLE_VALUE == pFile )
551  {
552  PrintErrorMessage(L"Open test file for file size change failed.",GetLastError());
553  ret = FALSE;
554  goto EXIT;
555  }
556 
557  DWORD newPointer = SetFilePointer(pFile,65536,NULL,FILE_BEGIN);//set file pointer to 65536 from the beginning.
558 
559  if( INVALID_SET_FILE_POINTER == newPointer)
560  {
561  PrintErrorMessage(L"SetFilePointer failed.",GetLastError());
562  goto EXIT;
563  }
564 
565  ret = SetEndOfFile(pFile);
566  if(0 != ret)
567  {
568  PrintErrorMessage(L"ALLOW_FILE_SIZE_CHANGE test failed.",0);
569  ret = FALSE;
570  goto EXIT;
571  }
572  else
573  {
574  dwError = GetLastError();
575 
576  if( ERROR_ACCESS_DENIED != dwError )
577  {
578  PrintErrorMessage(L"ALLOW_FILE_SIZE_CHANGE test failed.",dwError);
579  ret = FALSE;
580  goto EXIT;
581  }
582 
583  PrintPassedMessage(L"ALLOW_FILE_SIZE_CHANGE test passed.\n");
584  CloseHandle(pFile);
585  }
586 
587 
588 
589  //Test Remove ALLOW_QUERY_SECURITY_ACCESS.
591  AddNewFilterRule(accessFlag,filterMask);
592 
593  BYTE SecDescBuff[0x4000];
594  DWORD cbSD = sizeof(SecDescBuff);
595 
596  ret = GetFileSecurity(testFile, DACL_SECURITY_INFORMATION, SecDescBuff, cbSD, &cbSD);
597  if(0 != ret)
598  {
599  PrintErrorMessage(L"ALLOW_QUERY_SECURITY_ACCESS test failed.",0);
600  goto EXIT;
601  }
602  else
603  {
604  dwError = GetLastError();
605 
606  if( ERROR_ACCESS_DENIED != dwError )
607  {
608  PrintErrorMessage(L"ALLOW_QUERY_SECURITY_ACCESS test failed.",dwError);
609  ret = FALSE;
610  goto EXIT;
611  }
612 
613 
614  PrintPassedMessage(L"ALLOW_QUERY_SECURITY_ACCESS test passed.\n");
615  }
616 
617 
618  //Test Remove ALLOW_SET_SECURITY_ACCESS.
620  AddNewFilterRule(accessFlag,filterMask);
621 
622  cbSD = sizeof(SecDescBuff);
623 
624  ret = GetFileSecurity(testFile, GROUP_SECURITY_INFORMATION, SecDescBuff, cbSD, &cbSD);
625  if(0 == ret)
626  {
627  PrintErrorMessage(L"ALLOW_SET_SECURITY_ACCESS GetFileSecurity failed.",GetLastError());
628  goto EXIT;
629  }
630 
631  ret = SetFileSecurity(testFile, GROUP_SECURITY_INFORMATION, SecDescBuff);
632 
633  if(0 != ret)
634  {
635  PrintErrorMessage(L"ALLOW_SET_SECURITY_ACCESS test failed.",0);
636  goto EXIT;
637  }
638  else
639  {
640  dwError = GetLastError();
641 
642  if( ERROR_ACCESS_DENIED != dwError )
643  {
644  PrintErrorMessage(L"ALLOW_SET_SECURITY_ACCESS test failed.",dwError);
645  ret = FALSE;
646  goto EXIT;
647  }
648 
649 
650  PrintPassedMessage(L"ALLOW_SET_SECURITY_ACCESS test passed.\n");
651  }
652 
653 
654  //Test Remove ALLOW_DIRECTORY_LIST_ACCESS.
656  AddNewFilterRule(accessFlag,filterMask);
657 
658  WIN32_FIND_DATA findFileData;
659  pFile = FindFirstFile(filterMask, &findFileData);
660 
661  if(INVALID_HANDLE_VALUE != pFile)
662  {
663  PrintErrorMessage(L"ALLOW_DIRECTORY_LIST_ACCESS test failed.",0);
664 
665  printf("handle:%p file:%d ",pFile,findFileData.dwFileAttributes);
666  FindClose(pFile);
667  pFile = INVALID_HANDLE_VALUE;
668  goto EXIT;
669  }
670  else
671  {
672  dwError = GetLastError();
673 
674  if( ERROR_ACCESS_DENIED != dwError )
675  {
676  PrintErrorMessage(L"ALLOW_DIRECTORY_LIST_ACCESS test failed.",dwError);
677  ret = FALSE;
678  goto EXIT;
679  }
680 
681  PrintPassedMessage(L"ALLOW_DIRECTORY_LIST_ACCESS test passed.\n");
682  }
683 
684  //
685  //add exclude filter mask test
686  //you can add multiply exclude filter masks with the same accessFlag and same filter mask.
687  //
688  //Here we do the same test as above test, but we add the exclude filter mask,
689  //the above test, it can't open the file with security access, now we add the exclude to our test file,
690  //now we should be fine to open the file.
691  //
692  //
694  AddNewFilterRule(accessFlag,filterMask);
695  AddExcludeFileMaskToFilterRule(filterMask,L"*mytestFile.txt");
696 
697  pFile = CreateFile(testFile,GENERIC_ALL,NULL,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);
698  if( INVALID_HANDLE_VALUE == pFile )
699  {
700  PrintErrorMessage(L"Open test file for set information failed.",GetLastError());
701  ret = FALSE;
702  goto EXIT;
703  }
704 
705  //we will test with this API
706  ret = SetFileAttributes(testFile,FILE_ATTRIBUTE_READONLY);
707  if(0 == ret)
708  {
709  PrintErrorMessage(L"exclude filter mask test failed.",0);
710  ret = FALSE;
711  goto EXIT;
712  }
713  else
714  {
715  PrintPassedMessage(L"exclude filter mask test passed.\n");
716  CloseHandle(pFile);
717  pFile = INVALID_HANDLE_VALUE;
718  }
719 
720 
721 
722  ret = TRUE;
723 
724 EXIT:
725 
726  if(!ret )
727  {
728  PrintFailedMessage(L"\nAccess Flag Test failed.\n\n");
729  }
730  else
731  {
732  PrintPassedMessage(L"\nAccess Flag Test Passed.\n\n");
733  }
734 
735  if( INVALID_HANDLE_VALUE != pFile )
736  {
737  CloseHandle(pFile);
738  }
739 
740  return ret;
741 }
742 
743 BOOL
745 {
746 
747  //Test reparse open
748  ULONG accessFlag = REPARSE_FILE_OPEN;
749 
750  if(!AddNewFilterRule(accessFlag,filterMask) )
751  {
752  PrintLastErrorMessage(L"AddNewFilterRule failed.");
753  return FALSE;
754  }
755 
756  if(!AddReparseFileMaskToFilterRule(filterMask,reparseMask) )
757  {
758  PrintLastErrorMessage(L"AddReparseFileMaskToFilterRule failed.");
759  return FALSE;
760  }
761 
762  BOOL ret = FALSE;
763  HANDLE pFile = CreateFile(testFile,GENERIC_READ,NULL,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);
764  if( NULL == pFile )
765  {
766  PrintErrorMessage(L"Open test file failed.",GetLastError());
767  goto EXIT;
768  }
769  else
770  {
771  ULONG bufferLength =(ULONG)strlen(reparseData);
772  CHAR* buffer = (CHAR*)malloc( bufferLength );
773 
774  if(NULL == buffer)
775  {
776  PrintErrorMessage(L"Reparse filter rule test failed.Can't allocate memory for test.",0);
777  goto EXIT;
778  }
779 
780  ret = ReadFile(pFile,buffer,bufferLength,&bufferLength,NULL);
781 
782  if(0 == ret)
783  {
784  PrintErrorMessage(L"Read test file failed.",GetLastError());
785  goto EXIT;
786  }
787 
788  if( memcmp(buffer,reparseData,bufferLength) == 0)
789  {
790  ret = TRUE;
791  }
792  else
793  {
794  PrintErrorMessage(L"The file open didnt reparse to the new file.",GetLastError());
795  printf("ReparseData:%s\n\n",reparseData);
796  printf("DataReturn:%s\n\n",buffer);
797  ret = FALSE;
798  }
799 
800  }
801 
802 EXIT:
803 
804  if( ret )
805  {
806  PrintPassedMessage(L"\nReparse filter rule test passed.\n\n");
807  }
808  else
809  {
810  PrintFailedMessage(L"\nReparse filter rule test failed.\n\n");
811  }
812 
813  if(pFile)
814  {
815  CloseHandle(pFile);
816  }
817 
818  return ret;
819 
820 }
821 
822 BOOL
824 {
825  BOOL ret = FALSE;
826 
828  AddNewFilterRule(accessFlag,filterMask);
829 
831  RegisterIoRequest(requestRegistration);
832 
833  HANDLE pFile = CreateFile(testFile,GENERIC_READ,NULL,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);
834  if( INVALID_HANDLE_VALUE == pFile )
835  {
836  PrintErrorMessage(L"Open file for read test failed.",GetLastError());
837  goto EXIT;
838  }
839  else
840  {
841  ULONG bufferLength = (ULONG)strlen(replaceData);
842  CHAR* buffer = (CHAR*)malloc( bufferLength );
843 
844  if(NULL == buffer)
845  {
846  PrintErrorMessage(L"Can't allocate memory for test.",0);
847  goto EXIT;
848  }
849 
850  ret = ReadFile(pFile,buffer,bufferLength,&bufferLength,NULL);
851 
852  if(0 == ret)
853  {
854  PrintErrorMessage(L"Read test file failed.",GetLastError());
855  goto EXIT;
856  }
857 
858  if( memcmp(buffer,replaceData,bufferLength) == 0)
859  {
860 
861  //
862  //in pre-read call back fucntion test, it will return replace data instead of the test data.
863  //
864  ret = TRUE;
865  }
866  else
867  {
868  PrintErrorMessage(L"Rad data wasn't replaced by replace data.",0);
869 
870  printf("Read return data:\r\n%s\r\n\r\n",buffer);
871  printf("Replace data:\r\n%s\r\n\r\n",replaceData);
872 
873 
874  ret = FALSE;
875  }
876 
877  }
878 
879 EXIT:
880 
881  if( ret )
882  {
883  PrintPassedMessage(L"\nRead Control Filter Test Passed.\n\n");
884  }
885  else
886  {
887  PrintFailedMessage(L"\nRead Control Filter Test Failed.\n\n");
888  }
889 
890  if(pFile)
891  {
892  CloseHandle(pFile);
893  }
894 
895  return ret;
896 
897 }
898 
899 BOOL
901 {
902  BOOL ret = FALSE;
903 
904  ULONG accessFlag = ALLOW_MAX_RIGHT_ACCESS;
905  if(!AddNewFilterRule(accessFlag,filterMask) )
906  {
907  PrintLastErrorMessage(L"AddNewFilterRule failed.");
908  return FALSE;
909  }
910 
912 
913  if(!RegisterIoRequest(requestRegistration))
914  {
915  PrintLastErrorMessage(L"RegisterIoRequest failed.");
916  return FALSE;
917  }
918 
919  HANDLE pFile = CreateFile(testFile,GENERIC_ALL,NULL,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);
920  if( INVALID_HANDLE_VALUE == pFile )
921  {
922  PrintErrorMessage(L"Open file for write test failed.",GetLastError());
923  goto EXIT;
924  }
925  else
926  {
927  CHAR* buffer ="Test write data to my file,it will replace the test data in pre-write call back test function.";
928  ULONG bufferLength = (ULONG)strlen(buffer);
929 
930  ret = WriteFile(pFile,buffer,bufferLength,&bufferLength,NULL);
931 
932  if(0 == ret)
933  {
934  PrintErrorMessage(L"WriteFile failed.",GetLastError());
935  goto EXIT;
936  }
937 
938  ULONG replaceDataLength = (ULONG)strlen(replaceData);
939  CHAR* replaceDataBuffer = (CHAR*)malloc( replaceDataLength );
940 
941  if(NULL == replaceDataBuffer)
942  {
943  ret = FALSE;
944  PrintErrorMessage(L"Can't allocate memory for test.",0);
945  goto EXIT;
946  }
947 
948  //set file pointer the begining.
949  SetFilePointer(pFile,0,NULL,FILE_BEGIN);
950  ret = ReadFile(pFile,replaceDataBuffer,replaceDataLength,&replaceDataLength,NULL);
951 
952  if(0 == ret)
953  {
954  PrintErrorMessage(L"WriteControlFilterTest ReadFile failed.",GetLastError());
955  goto EXIT;
956  }
957 
958  if( memcmp(replaceDataBuffer,replaceData,replaceDataLength) == 0)
959  {
960 
961  //
962  //in pre-write call back fucntion test, it will return replace data instead of the test data.
963  //
964 
965  ret = TRUE;
966  }
967  else
968  {
969  printf("Write Test Failed.\nDataFromFile:%s \n CorrectData:%s\n",replaceDataBuffer,replaceData);
970  ret = FALSE;
971  }
972 
973  }
974 
975 EXIT:
976 
977  if( ret )
978  {
979  PrintPassedMessage(L"\nWrite Control Filter Test Passed.\n\n");
980  }
981  else
982  {
983  PrintFailedMessage(L"\nWrite Control Filter Test Failed.\n\n");
984  }
985 
986  if(pFile)
987  {
988  CloseHandle(pFile);
989  }
990 
991  return ret;
992 
993 }
994 
995 BOOL
997 {
998  BOOL ret = FALSE;
999 
1001  AddNewFilterRule(accessFlag,filterMask);
1002 
1003  ULONG requestRegistration = PRE_QUERY_INFORMATION;
1004  RegisterIoRequest(requestRegistration);
1005 
1006  HANDLE pFile = CreateFile(testFile,GENERIC_READ,NULL,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);
1007  if( INVALID_HANDLE_VALUE == pFile )
1008  {
1009  PrintErrorMessage(L"Open test file failed.",GetLastError());
1010  goto EXIT;
1011  }
1012  else
1013  {
1014  FILETIME creationTime;
1015  FILETIME lastAccessTime;
1016  FILETIME lastWriteTime;
1017 
1018  ret = GetFileTime(pFile,&creationTime,&lastAccessTime,&lastWriteTime );
1019 
1020  if(0 == ret)
1021  {
1022  PrintErrorMessage(L"QueryInformationControlTest GetFileInformationByHandle failed.",GetLastError());
1023  goto EXIT;
1024  }
1025  else
1026  {
1027  LARGE_INTEGER writeTime = GetTestFileTime();
1028 
1029  if( writeTime.HighPart != lastWriteTime.dwHighDateTime || writeTime.LowPart != lastWriteTime.dwLowDateTime )
1030  {
1031  ret = FALSE;
1032  PrintErrorMessage(L"QueryInformationControlTest failed. Return last write time is not correct", 0 );
1033  }
1034 
1035  }
1036 
1037 
1038  }
1039 
1040 EXIT:
1041 
1042  if( ret )
1043  {
1044  PrintPassedMessage(L"\nQueryInformationControlTest passed.\n\n");
1045  }
1046  else
1047  {
1048  PrintFailedMessage(L"\nQueryInformationControlTest failed.\n\n");
1049  }
1050 
1051  if(pFile)
1052  {
1053  CloseHandle(pFile);
1054  }
1055 
1056  return ret;
1057 }
1058 
1059 BOOL
1061 {
1062  BOOL ret = FALSE;
1063 
1064  ULONG accessFlag = ALLOW_MAX_RIGHT_ACCESS;
1065  AddNewFilterRule(accessFlag,filterMask);
1066 
1067  ULONG requestRegistration = PRE_SET_INFORMATION;
1068  RegisterIoRequest(requestRegistration);
1069 
1070  //
1071  //In PRE_SET_INFORMATION call back test function,we add the readonly attribute to the file.
1072  //
1073 
1074  ret = SetFileAttributes(testFile,FILE_ATTRIBUTE_NORMAL);
1075 
1076  if( 0 == ret)
1077  {
1078  PrintErrorMessage(L"SetInformationControlTest SetFileAttributes failed.",GetLastError());
1079  return FALSE;
1080  }
1081 
1082  ULONG attributes = GetFileAttributes(testFile);
1083 
1084  if( INVALID_FILE_ATTRIBUTES == attributes )
1085  {
1086  PrintErrorMessage(L"SetInformationControlTest GetFileAttributes failed.",GetLastError());
1087  return FALSE;
1088  }
1089 
1090  if( attributes & FILE_ATTRIBUTE_READONLY )
1091  {
1092  ret = TRUE;
1093  PrintPassedMessage(L"\nSetInformationControlTest passed.\n\n");
1094  }
1095  else
1096  {
1097  PrintFailedMessage(L"\nSetInformationControlTest failed.\n\n");
1098  }
1099 
1100 
1101  return ret;
1102 }
1103 
1104 BOOL
1106 {
1107  BOOL ret = FALSE;
1108 
1110  AddNewFilterRule(accessFlag,filterMask);
1111 
1112  ULONG requestRegistration = POST_DIRECTORY;
1113  RegisterIoRequest(requestRegistration);
1114 
1115  WIN32_FIND_DATA ffd;
1116  HANDLE pFile = FindFirstFile(filterMask, &ffd);
1117 
1118  do
1119  {
1120  if (ffd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
1121  {
1122  printf(" %ws <DIR>\n", ffd.cFileName);
1123  }
1124  else
1125  {
1126  LARGE_INTEGER filesize;
1127  filesize.LowPart = ffd.nFileSizeLow;
1128  filesize.HighPart = ffd.nFileSizeHigh;
1129  printf(" %ws %I64d bytes\n", ffd.cFileName, filesize.QuadPart);
1130 
1131  if( filesize.QuadPart != GetTestFileSize())
1132  {
1133  PrintErrorMessage(L"Browse directory failed.Return file size is not the same as test file size.",0);
1134  ret = FALSE;
1135  break;
1136  }
1137  }
1138  }
1139  while (FindNextFile(pFile, &ffd) != 0);
1140 
1141  if( INVALID_HANDLE_VALUE != pFile )
1142  {
1143  FindClose(pFile);
1144  }
1145 
1146  DWORD dwError = GetLastError();
1147  if (dwError != ERROR_NO_MORE_FILES)
1148  {
1149  PrintErrorMessage(L"Browse directory test failed. Return error:",dwError);
1150  ret = FALSE;
1151  }
1152  else
1153  {
1154  PrintPassedMessage(L"\nBrowseDirectoryControlTest passed.\n\n");
1155  ret = TRUE;
1156  }
1157 
1158  return ret;
1159 }
1160 
1161 
1162 BOOL
1164 {
1165  BOOL ret = FALSE;
1166 
1167  //Test Remove ALLOW_OPEN_WITH_WRITE_ACCESS for current process
1169  //It will overwrite the previous filter rule, since the filterMask is the same, accessFalg is different.
1170  AddNewFilterRule(accessFlag,filterMask);
1171 
1172  ULONG currentPid = GetCurrentProcessId();
1173 
1174  AddIncludeProcessIdToFilterRule(filterMask,currentPid);
1175 
1176  HANDLE pFile = CreateFile(testFile,GENERIC_WRITE,NULL,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);
1177  if( INVALID_HANDLE_VALUE != pFile )
1178  {
1179  PrintErrorMessage(L"IncludeExcludeProcessNameTest test failed.",0);
1180  return FALSE;
1181  }
1182  else
1183  {
1184  DWORD dwError = GetLastError();
1185 
1186  if( ERROR_ACCESS_DENIED != dwError )
1187  {
1188  PrintErrorMessage(L"IncludeExcludeProcessNameTest test failed.",dwError);
1189  return FALSE;
1190  }
1191  PrintPassedMessage(L"IncludeExcludeProcessNameTest test passed.\n");
1192  }
1193 
1194  return ret;
1195 }
1196 
1197 
1198 
1199 BOOLEAN
1201 {
1202  BOOLEAN ret = FALSE;
1203 
1204  //Test Remove ALLOW_OPEN_WITH_WRITE_ACCESS for current process
1206  //It will overwrite the previous filter rule, since the filterMask is the same, accessFalg is different.
1207  AddNewFilterRule(accessFlag,filterMask);
1208 
1209  ULONG userNameSize = MAX_PATH;
1210  WCHAR userName[MAX_PATH];
1211 
1212  if( 0 == GetUserName(userName,&userNameSize) )
1213  {
1214  PrintErrorMessage(L"GetUserName test failed.",GetLastError());
1215  return FALSE;
1216  }
1217 
1218  AddIncludeUserNameToFilterRule(filterMask,userName);
1219 
1220  HANDLE pFile = CreateFile(testFile,GENERIC_WRITE,NULL,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);
1221  if( INVALID_HANDLE_VALUE != pFile )
1222  {
1223  PrintErrorMessage(L"IncludeExcludeUserNameTest test failed.",0);
1224  return FALSE;
1225 
1226  }
1227  else
1228  {
1229  DWORD dwError = GetLastError();
1230 
1231  if( ERROR_ACCESS_DENIED != dwError )
1232  {
1233  PrintErrorMessage(L"IncludeExcludeUserNameTest test failed.",dwError);
1234  return FALSE;
1235 
1236  }
1237 
1238  PrintPassedMessage(L"IncludeExcludeUserNameTest test passed.\n");
1239  }
1240 
1241 
1242  return ret;
1243 }
1244 
1245 void
1247 {
1248 
1249  if( !SetupTestEnvironment())
1250  {
1251  PrintErrorMessage(L"Failed to setup test environment.",0);
1252  return;
1253  }
1254 
1255  //Reset the filter config setting.
1256  ResetConfigData();
1257 
1258  //Set filter maiximum wait for user mode response time out.
1259  SetConnectionTimeout(30);
1260 
1261  //Set filter to file system call back type.
1262  if(!SetFilterType(FILE_SYSTEM_CONTROL))
1263  {
1264  PrintLastErrorMessage(L"Set filter type failed.");
1265  return;
1266  }
1267 
1269 
1271 
1273 
1275 
1277 
1279 
1281 
1283 
1284  /*QuerySecurityTest();
1285 
1286  SetSecurityTest();*/
1287 
1289 }
WCHAR * userName
Definition: FilterAPI.h:604
BYTE ULONG bufferLength
Definition: FilterAPI.h:812
BOOL SetupTestEnvironment()
Definition: UnitTest.cpp:164
void PrintErrorMessage(LPWSTR message, DWORD errorCode)
Definition: Tools.cpp:93
BOOL ReparseFilterRuleTest()
Definition: UnitTest.cpp:744
BOOL QueryInformationControlTest()
Definition: UnitTest.cpp:996
BOOLEAN IncludeExcludeUserNameTest()
Definition: UnitTest.cpp:1200
WCHAR * GetTestReparseFileName()
Definition: UnitTest.cpp:62
BOOL SetInformationControlTest()
Definition: UnitTest.cpp:1060
WCHAR * GetFilterMask()
Definition: UnitTest.cpp:56
BOOL IsTestFolder(WCHAR *fileName)
Definition: UnitTest.cpp:43
CHAR * GetReplaceData()
Definition: UnitTest.cpp:68
#define MAX_PATH
Definition: FilterAPI.h:23
WCHAR * filterMask
Definition: FilterAPI.h:557
BOOL IsTestFile(WCHAR *fileName, ULONG fileNameLength)
Definition: UnitTest.cpp:30
LONGLONG GetTestFileSize()
Definition: UnitTest.cpp:74
BOOL WriteControlFilterTest()
Definition: UnitTest.cpp:900
LARGE_INTEGER GetTestFileTime()
Definition: UnitTest.cpp:80
WCHAR * testFolder
BOOL AccessFlagControlTest()
Definition: UnitTest.cpp:179
void ControlFilterUnitTest()
Definition: UnitTest.cpp:1246
void PrintLastErrorMessage(WCHAR *message)
Definition: Tools.cpp:49
void PrintPassedMessage(WCHAR *message)
Definition: Tools.cpp:33
BOOL IncludeExcludeProcessNameTest()
Definition: UnitTest.cpp:1163
BOOL CreateTestFile(WCHAR *folder, WCHAR *fileName, CHAR *data)
Definition: UnitTest.cpp:108
BOOL ReadControlFilterTest()
Definition: UnitTest.cpp:823
void PrintFailedMessage(WCHAR *message)
Definition: Tools.cpp:39
LONGLONG data
Definition: FilterAPI.h:521
BOOL BrowseDirectoryControlTest()
Definition: UnitTest.cpp:1105
WCHAR * testFile

Social Network


Services Overview

Architect, implement and test file system filter drivers for a wide range of functionality. We can offer several levels of assistance to meet your specific.

Contact Us

You are welcome to contact us for salse or partnership.

Sales: sales@easefilter.com
Support: support@easefilter.com
Info: info@easefilter.com