EaseFilter Demo Project
FeatureDemo.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  //Test Remove ALLOW_OPEN_WTIH_ACCESS_SYSTEM_SECURITY
190  AddFilterRule(accessFlag,filterMask,L"");
191 
192  pFile = CreateFile(testFile,ACCESS_SYSTEM_SECURITY,NULL,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);
193  if( INVALID_HANDLE_VALUE != pFile )
194  {
195  PrintErrorMessage(L"ALLOW_OPEN_WTIH_ACCESS_SYSTEM_SECURITY test failed.",0);
196  ret = FALSE;
197  goto EXIT;
198  }
199  else
200  {
201  dwError = GetLastError();
202 
203  if( ERROR_ACCESS_DENIED != dwError )
204  {
205  PrintErrorMessage(L"ALLOW_OPEN_WTIH_ACCESS_SYSTEM_SECURITY test failed.",dwError);
206  ret = FALSE;
207  goto EXIT;
208  }
209 
210  PrintPassedMessage(L"ALLOW_OPEN_WTIH_ACCESS_SYSTEM_SECURITY test passed.\n");
211  }
212 
213 
214  //Test Remove ALLOW_OPEN_WITH_READ_ACCESS
216  //It will overwrite the previous filter rule, since the filterMask is the same, accessFalg is different.
217  AddFilterRule(accessFlag,filterMask,L"");
218 
219  pFile = CreateFile(testFile,GENERIC_READ,NULL,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);
220  if( INVALID_HANDLE_VALUE != pFile )
221  {
222  PrintErrorMessage(L"ALLOW_OPEN_WITH_READ_ACCESS test failed.",0);
223  ret = FALSE;
224  goto EXIT;
225  }
226  else
227  {
228  dwError = GetLastError();
229 
230  if( ERROR_ACCESS_DENIED != dwError )
231  {
232  PrintErrorMessage(L"ALLOW_OPEN_WITH_READ_ACCESS test failed.",dwError);
233  ret = FALSE;
234  goto EXIT;
235  }
236  PrintPassedMessage(L"ALLOW_OPEN_WITH_READ_ACCESS test passed.\n");
237  }
238 
239 
240  //Test Remove ALLOW_OPEN_WITH_WRITE_ACCESS
242  AddFilterRule(accessFlag,filterMask,L"");
243 
244  pFile = CreateFile(testFile,GENERIC_WRITE,NULL,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);
245  if( INVALID_HANDLE_VALUE != pFile )
246  {
247  PrintErrorMessage(L"ALLOW_OPEN_WITH_WRITE_ACCESS test failed.",0);
248  ret = FALSE;
249  goto EXIT;
250  }
251  else
252  {
253  dwError = GetLastError();
254 
255  if( ERROR_ACCESS_DENIED != dwError )
256  {
257  PrintErrorMessage(L"ALLOW_OPEN_WITH_WRITE_ACCESS test failed.",dwError);
258  ret = FALSE;
259  goto EXIT;
260  }
261 
262  PrintPassedMessage(L"ALLOW_OPEN_WITH_WRITE_ACCESS test passed.\n");
263  }
264 
265  //Not allow open file with create or overwrite option.
267  AddFilterRule(accessFlag,filterMask,L"");
268 
269  pFile = CreateFile(testFile,GENERIC_WRITE,NULL,NULL,CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL,NULL);
270  if( INVALID_HANDLE_VALUE != pFile )
271  {
272  PrintErrorMessage(L"ALLOW_OPEN_WITH_CREATE_OR_OVERWRITE_EXIST_FILE test failed.",0);
273  ret = FALSE;
274  goto EXIT;
275  }
276  else
277  {
278  dwError = GetLastError();
279 
280  if( ERROR_ACCESS_DENIED != dwError )
281  {
282  PrintErrorMessage(L"ALLOW_OPEN_WITH_CREATE_OR_OVERWRITE_EXIST_FILE test failed.",dwError);
283  ret = FALSE;
284  goto EXIT;
285  }
286 
287  PrintPassedMessage(L"ALLOW_OPEN_WITH_CREATE_OR_OVERWRITE_EXIST_FILE test passed.\n");
288  }
289 
290 
291 
292  //Test Remove ALLOW_OPEN_WITH_DELETE_ACCESS.
294  AddFilterRule(accessFlag,filterMask,L"");
295 
296  pFile = CreateFile(testFile,DELETE,NULL,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);
297  if( INVALID_HANDLE_VALUE != pFile )
298  {
299  PrintErrorMessage(L"ALLOW_OPEN_WITH_DELETE_ACCESS test failed.",0);
300  ret = FALSE;
301  goto EXIT;
302  }
303  else
304  {
305  dwError = GetLastError();
306 
307  if( ERROR_ACCESS_DENIED != dwError )
308  {
309  PrintErrorMessage(L"ALLOW_OPEN_WITH_DELETE_ACCESS test failed.",dwError);
310  ret = FALSE;
311  goto EXIT;
312  }
313 
314  PrintPassedMessage(L"ALLOW_OPEN_WITH_DELETE_ACCESS test passed.\n");
315  }
316 
317 
318  //Test Remove ALLOW_READ_ACCESS.
319  accessFlag = (~ALLOW_READ_ACCESS) & ALLOW_MAX_RIGHT_ACCESS;
320  AddFilterRule(accessFlag,filterMask,L"");
321 
322  pFile = CreateFile(testFile,GENERIC_READ,NULL,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);
323  if( INVALID_HANDLE_VALUE == pFile )
324  {
325  PrintErrorMessage(L"Open test file for read access failed.",GetLastError());
326  ret = FALSE;
327  goto EXIT;
328  }
329 
330  ret = ReadFile(pFile,buffer,bufferLength,&bufferLength,NULL);
331  if(0 != ret)
332  {
333  PrintErrorMessage(L"ALLOW_READ_ACCESS test failed.",0);
334  goto EXIT;
335  }
336  else
337  {
338  dwError = GetLastError();
339 
340  if( ERROR_ACCESS_DENIED != dwError )
341  {
342  PrintErrorMessage(L"ALLOW_READ_ACCESS test failed.",dwError);
343  ret = FALSE;
344  goto EXIT;
345  }
346 
347  PrintPassedMessage(L"ALLOW_READ_ACCESS test passed.\n");
348  CloseHandle(pFile);
349  }
350 
351  //Test Remove ALLOW_WRITE_ACCESS.
352  accessFlag = (~ALLOW_WRITE_ACCESS) & ALLOW_MAX_RIGHT_ACCESS;
353  AddFilterRule(accessFlag,filterMask,L"");
354 
355  pFile = CreateFile(testFile,GENERIC_WRITE,NULL,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);
356  if( INVALID_HANDLE_VALUE == pFile )
357  {
358  PrintErrorMessage(L"Open test file for write access failed.",GetLastError());
359  ret = FALSE;
360  goto EXIT;
361  }
362 
363 
364  ret = WriteFile(pFile,buffer,bufferLength,&bufferLength,NULL);
365  if(0 != ret)
366  {
367  PrintErrorMessage(L"ALLOW_WRITE_ACCESS test failed.",0);
368  goto EXIT;
369  }
370  else
371  {
372  dwError = GetLastError();
373 
374  if( ERROR_ACCESS_DENIED != dwError )
375  {
376  PrintErrorMessage(L"ALLOW_WRITE_ACCESS test failed.",dwError);
377  ret = FALSE;
378  goto EXIT;
379  }
380  PrintPassedMessage(L"ALLOW_WRITE_ACCESS test passed.\n");
381  CloseHandle(pFile);
382  }
383 
384 
385  //Test Remove ALLOW_QUERY_INFORMATION_ACCESS.
387  AddFilterRule(accessFlag,filterMask,L"");
388 
389  pFile = CreateFile(testFile,GENERIC_READ,NULL,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);
390  if( INVALID_HANDLE_VALUE == pFile )
391  {
392  PrintErrorMessage(L"Open test file for query information failed.",GetLastError());
393  ret = FALSE;
394  goto EXIT;
395  }
396 
397  BY_HANDLE_FILE_INFORMATION fileInfo;
398  ret = GetFileInformationByHandle(pFile,&fileInfo);
399  if(0 != ret)
400  {
401  PrintErrorMessage(L"ALLOW_QUERY_INFORMATION_ACCESS test failed.",0);
402  goto EXIT;
403  }
404  else
405  {
406  dwError = GetLastError();
407 
408  if( ERROR_ACCESS_DENIED != dwError )
409  {
410  PrintErrorMessage(L"ALLOW_QUERY_INFORMATION_ACCESS test failed.",dwError);
411  ret = FALSE;
412  goto EXIT;
413  }
414 
415  PrintPassedMessage(L"ALLOW_QUERY_INFORMATION_ACCESS test passed.\n");
416  CloseHandle(pFile);
417  }
418 
419 
420 
421  //Test Remove ALLOW_SET_INFORMATION.
423  AddFilterRule(accessFlag,filterMask,L"");
424 
425  pFile = CreateFile(testFile,GENERIC_ALL,NULL,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);
426  if( INVALID_HANDLE_VALUE == pFile )
427  {
428  PrintErrorMessage(L"Open test file for set information failed.",GetLastError());
429  ret = FALSE;
430  goto EXIT;
431  }
432 
433  //this API only support in windows vista or later version.
434  //ret = SetFileInformationByHandle(pFile,FileBasicInfo,&fileInfo,sizeof(BY_HANDLE_FILE_INFORMATION));
435 
436  //we will test with this API
437  ret = SetFileAttributes(testFile,FILE_ATTRIBUTE_READONLY);
438  if(0 != ret)
439  {
440  PrintErrorMessage(L"ALLOW_SET_INFORMATION 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_SET_INFORMATION test failed.",dwError);
450  ret = FALSE;
451  goto EXIT;
452  }
453 
454  PrintPassedMessage(L"ALLOW_SET_INFORMATION test passed.\n");
455  CloseHandle(pFile);
456  }
457 
458  //Test Remove ALLOW_FILE_RENAME.
459  accessFlag = (~ALLOW_FILE_RENAME) & ALLOW_MAX_RIGHT_ACCESS;
460  AddFilterRule(accessFlag,filterMask,L"");
461 
462  ret = MoveFile (testFile,L"c:\\TestMoveFileNameFile.txt");
463  if(0 != ret)
464  {
465  PrintErrorMessage(L"ALLOW_FILE_RENAME test failed.",0);
466  goto EXIT;
467  }
468  else
469  {
470  dwError = GetLastError();
471 
472  if( ERROR_ACCESS_DENIED != dwError )
473  {
474  PrintErrorMessage(L"ALLOW_FILE_RENAME test failed.",dwError);
475  ret = FALSE;
476  goto EXIT;
477  }
478 
479  PrintPassedMessage(L"ALLOW_FILE_RENAME test passed.\n");
480  }
481 
482  //Test Remove ALLOW_FILE_DELETE.
483  accessFlag = (~ALLOW_FILE_DELETE) & ALLOW_MAX_RIGHT_ACCESS;
484  AddFilterRule(accessFlag,filterMask,L"");
485 
486  ret = DeleteFile(testFile);
487  if(0 != ret)
488  {
489  PrintErrorMessage(L"ALLOW_FILE_DELETE test failed.",0);
490  goto EXIT;
491  }
492  else
493  {
494  dwError = GetLastError();
495 
496  if( ERROR_ACCESS_DENIED != dwError )
497  {
498  PrintErrorMessage(L"ALLOW_FILE_DELETE test failed.",dwError);
499  ret = FALSE;
500  goto EXIT;
501  }
502 
503  PrintPassedMessage(L"ALLOW_FILE_DELETE test passed.\n");
504  }
505 
506  //Test Remove ALLOW_FILE_SIZE_CHANGE.
508  AddFilterRule(accessFlag,filterMask,L"");
509 
510  pFile = CreateFile(testFile,GENERIC_ALL,NULL,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);
511  if( INVALID_HANDLE_VALUE == pFile )
512  {
513  PrintErrorMessage(L"Open test file for file size change failed.",GetLastError());
514  ret = FALSE;
515  goto EXIT;
516  }
517 
518  DWORD newPointer = SetFilePointer(pFile,65536,NULL,FILE_BEGIN);//set file pointer to 65536 from the beginning.
519 
520  if( INVALID_SET_FILE_POINTER == newPointer)
521  {
522  PrintErrorMessage(L"SetFilePointer failed.",GetLastError());
523  goto EXIT;
524  }
525 
526  ret = SetEndOfFile(pFile);
527  if(0 != ret)
528  {
529  PrintErrorMessage(L"ALLOW_FILE_SIZE_CHANGE test failed.",0);
530  ret = FALSE;
531  goto EXIT;
532  }
533  else
534  {
535  dwError = GetLastError();
536 
537  if( ERROR_ACCESS_DENIED != dwError )
538  {
539  PrintErrorMessage(L"ALLOW_FILE_SIZE_CHANGE test failed.",dwError);
540  ret = FALSE;
541  goto EXIT;
542  }
543 
544  PrintPassedMessage(L"ALLOW_FILE_SIZE_CHANGE test passed.\n");
545  CloseHandle(pFile);
546  }
547 
548 
549 
550  //Test Remove ALLOW_QUERY_SECURITY_ACCESS.
552  AddFilterRule(accessFlag,filterMask,L"");
553 
554  BYTE SecDescBuff[0x4000];
555  DWORD cbSD = sizeof(SecDescBuff);
556 
557  ret = GetFileSecurity(testFile, DACL_SECURITY_INFORMATION, SecDescBuff, cbSD, &cbSD);
558  if(0 != ret)
559  {
560  PrintErrorMessage(L"ALLOW_QUERY_SECURITY_ACCESS test failed.",0);
561  goto EXIT;
562  }
563  else
564  {
565  dwError = GetLastError();
566 
567  if( ERROR_ACCESS_DENIED != dwError )
568  {
569  PrintErrorMessage(L"ALLOW_QUERY_SECURITY_ACCESS test failed.",dwError);
570  ret = FALSE;
571  goto EXIT;
572  }
573 
574 
575  PrintPassedMessage(L"ALLOW_QUERY_SECURITY_ACCESS test passed.\n");
576  }
577 
578 
579  //Test Remove ALLOW_SET_SECURITY_ACCESS.
581  AddFilterRule(accessFlag,filterMask,L"");
582 
583  cbSD = sizeof(SecDescBuff);
584 
585  ret = GetFileSecurity(testFile, GROUP_SECURITY_INFORMATION, SecDescBuff, cbSD, &cbSD);
586  if(0 == ret)
587  {
588  PrintErrorMessage(L"ALLOW_SET_SECURITY_ACCESS GetFileSecurity failed.",GetLastError());
589  goto EXIT;
590  }
591 
592  ret = SetFileSecurity(testFile, GROUP_SECURITY_INFORMATION, SecDescBuff);
593 
594  if(0 != ret)
595  {
596  PrintErrorMessage(L"ALLOW_SET_SECURITY_ACCESS test failed.",0);
597  goto EXIT;
598  }
599  else
600  {
601  dwError = GetLastError();
602 
603  if( ERROR_ACCESS_DENIED != dwError )
604  {
605  PrintErrorMessage(L"ALLOW_SET_SECURITY_ACCESS test failed.",dwError);
606  ret = FALSE;
607  goto EXIT;
608  }
609 
610 
611  PrintPassedMessage(L"ALLOW_SET_SECURITY_ACCESS test passed.\n");
612  }
613 
614 
615  //Test Remove ALLOW_DIRECTORY_LIST_ACCESS.
617  AddFilterRule(accessFlag,filterMask,L"");
618 
619  WIN32_FIND_DATA findFileData;
620  pFile = FindFirstFile(filterMask, &findFileData);
621 
622  if(INVALID_HANDLE_VALUE != pFile)
623  {
624  PrintErrorMessage(L"ALLOW_DIRECTORY_LIST_ACCESS test failed.",0);
625 
626  printf("handle:%p file:%d ",pFile,findFileData.dwFileAttributes);
627  FindClose(pFile);
628  pFile = INVALID_HANDLE_VALUE;
629  goto EXIT;
630  }
631  else
632  {
633  dwError = GetLastError();
634 
635  if( ERROR_ACCESS_DENIED != dwError )
636  {
637  PrintErrorMessage(L"ALLOW_DIRECTORY_LIST_ACCESS test failed.",dwError);
638  ret = FALSE;
639  goto EXIT;
640  }
641 
642  PrintPassedMessage(L"ALLOW_DIRECTORY_LIST_ACCESS test passed.\n");
643  }
644 
645  //
646  //add exclude filter mask test
647  //you can add multiply exclude filter masks with the same accessFlag and same filter mask.
648  //
649  //Here we do the same test as above test, but we add the exclude filter mask,
650  //the above test, it can't open the file with security access, now we add the exclude to our test file,
651  //now we should be fine to open the file.
652  //
653  //
655  AddFilterRule(accessFlag,filterMask,L"*mytestFile.txt");
656 
657  pFile = CreateFile(testFile,GENERIC_ALL,NULL,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);
658  if( INVALID_HANDLE_VALUE == pFile )
659  {
660  PrintErrorMessage(L"Open test file for set information failed.",GetLastError());
661  ret = FALSE;
662  goto EXIT;
663  }
664 
665  //we will test with this API
666  ret = SetFileAttributes(testFile,FILE_ATTRIBUTE_READONLY);
667  if(0 == ret)
668  {
669  PrintErrorMessage(L"exclude filter mask test failed.",0);
670  ret = FALSE;
671  goto EXIT;
672  }
673  else
674  {
675  PrintPassedMessage(L"exclude filter mask test passed.\n");
676  CloseHandle(pFile);
677  pFile = INVALID_HANDLE_VALUE;
678  }
679 
680 
681 
682  ret = TRUE;
683 
684 EXIT:
685 
686  if(!ret )
687  {
688  PrintFailedMessage(L"\nAccess Flag Test failed.\n\n");
689  }
690  else
691  {
692  PrintPassedMessage(L"\nAccess Flag Test Passed.\n\n");
693  }
694 
695  if( INVALID_HANDLE_VALUE != pFile )
696  {
697  CloseHandle(pFile);
698  }
699 
700  return ret;
701 }
702 
703 BOOL
705 {
706 
707  //Test reparse open
708  ULONG accessFlag = REPARSE_FILE_OPEN;
709  AddFilterRule(accessFlag,filterMask,reparseMask);
710 
711  BOOL ret = FALSE;
712  HANDLE pFile = CreateFile(testFile,GENERIC_READ,NULL,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);
713  if( NULL == pFile )
714  {
715  PrintErrorMessage(L"Open test file failed.",GetLastError());
716  goto EXIT;
717  }
718  else
719  {
720  ULONG bufferLength =(ULONG)strlen(reparseData);
721  CHAR* buffer = (CHAR*)malloc( bufferLength );
722 
723  if(NULL == buffer)
724  {
725  PrintErrorMessage(L"Reparse filter rule test failed.Can't allocate memory for test.",0);
726  goto EXIT;
727  }
728 
729  ret = ReadFile(pFile,buffer,bufferLength,&bufferLength,NULL);
730 
731  if(0 == ret)
732  {
733  PrintErrorMessage(L"Read test file failed.",GetLastError());
734  goto EXIT;
735  }
736 
737  if( memcmp(buffer,reparseData,bufferLength) == 0)
738  {
739  ret = TRUE;
740  }
741  else
742  {
743  PrintErrorMessage(L"The file open didnt reparse to the new file.",GetLastError());
744  printf("ReparseData:%s\n\n",reparseData);
745  printf("DataReturn:%s\n\n",buffer);
746  ret = FALSE;
747  }
748 
749  }
750 
751 EXIT:
752 
753  if( ret )
754  {
755  PrintPassedMessage(L"\nReparse filter rule test passed.\n\n");
756  }
757  else
758  {
759  PrintFailedMessage(L"\nReparse filter rule test failed.\n\n");
760  }
761 
762  if(pFile)
763  {
764  CloseHandle(pFile);
765  }
766 
767  return ret;
768 
769 }
770 
771 BOOL
773 {
774  BOOL ret = FALSE;
775 
777  AddFilterRule(accessFlag,filterMask,L"");
778 
780  RegisterIoRequest(requestRegistration);
781 
782  HANDLE pFile = CreateFile(testFile,GENERIC_READ,NULL,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);
783  if( INVALID_HANDLE_VALUE == pFile )
784  {
785  PrintErrorMessage(L"Open file for read test failed.",GetLastError());
786  goto EXIT;
787  }
788  else
789  {
790  ULONG bufferLength = (ULONG)strlen(replaceData);
791  CHAR* buffer = (CHAR*)malloc( bufferLength );
792 
793  if(NULL == buffer)
794  {
795  PrintErrorMessage(L"Can't allocate memory for test.",0);
796  goto EXIT;
797  }
798 
799  ret = ReadFile(pFile,buffer,bufferLength,&bufferLength,NULL);
800 
801  if(0 == ret)
802  {
803  PrintErrorMessage(L"Read test file failed.",GetLastError());
804  goto EXIT;
805  }
806 
807  if( memcmp(buffer,replaceData,bufferLength) == 0)
808  {
809 
810  //
811  //in pre-read call back fucntion test, it will return replace data instead of the test data.
812  //
813  ret = TRUE;
814  }
815  else
816  {
817  PrintErrorMessage(L"Rad data wasn't replaced by replace data.",0);
818 
819  printf("Read return data:\r\n%s\r\n\r\n",buffer);
820  printf("Replace data:\r\n%s\r\n\r\n",replaceData);
821 
822 
823  ret = FALSE;
824  }
825 
826  }
827 
828 EXIT:
829 
830  if( ret )
831  {
832  PrintPassedMessage(L"\nRead Control Filter Test Passed.\n\n");
833  }
834  else
835  {
836  PrintFailedMessage(L"\nRead Control Filter Test Failed.\n\n");
837  }
838 
839  if(pFile)
840  {
841  CloseHandle(pFile);
842  }
843 
844  return ret;
845 
846 }
847 
848 BOOL
850 {
851  BOOL ret = FALSE;
852 
853  ULONG accessFlag = ALLOW_MAX_RIGHT_ACCESS;
854  AddFilterRule(accessFlag,filterMask,L"");
855 
857  RegisterIoRequest(requestRegistration);
858 
859  HANDLE pFile = CreateFile(testFile,GENERIC_ALL,NULL,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);
860  if( INVALID_HANDLE_VALUE == pFile )
861  {
862  PrintErrorMessage(L"Open file for write test failed.",GetLastError());
863  goto EXIT;
864  }
865  else
866  {
867  CHAR* buffer ="Test write data to my file,it will replace the test data in pre-write call back test function.";
868  ULONG bufferLength = (ULONG)strlen(buffer);
869 
870  ret = WriteFile(pFile,buffer,bufferLength,&bufferLength,NULL);
871 
872  if(0 == ret)
873  {
874  PrintErrorMessage(L"WriteFile failed.",GetLastError());
875  goto EXIT;
876  }
877 
878  ULONG replaceDataLength = (ULONG)strlen(replaceData);
879  CHAR* replaceDataBuffer = (CHAR*)malloc( replaceDataLength );
880 
881  if(NULL == replaceDataBuffer)
882  {
883  ret = FALSE;
884  PrintErrorMessage(L"Can't allocate memory for test.",0);
885  goto EXIT;
886  }
887 
888  //set file pointer the begining.
889  SetFilePointer(pFile,0,NULL,FILE_BEGIN);
890  ret = ReadFile(pFile,replaceDataBuffer,replaceDataLength,&replaceDataLength,NULL);
891 
892  if(0 == ret)
893  {
894  PrintErrorMessage(L"WriteControlFilterDemo ReadFile failed.",GetLastError());
895  goto EXIT;
896  }
897 
898  if( memcmp(replaceDataBuffer,replaceData,replaceDataLength) == 0)
899  {
900 
901  //
902  //in pre-write call back fucntion test, it will return replace data instead of the test data.
903  //
904 
905  ret = TRUE;
906  }
907  else
908  {
909  printf("Write Test Failed.\nDataFromFile:%s \n CorrectData:%s\n",replaceDataBuffer,replaceData);
910  ret = FALSE;
911  }
912 
913  }
914 
915 EXIT:
916 
917  if( ret )
918  {
919  PrintPassedMessage(L"\nWrite Control Filter Test Passed.\n\n");
920  }
921  else
922  {
923  PrintFailedMessage(L"\nWrite Control Filter Test Failed.\n\n");
924  }
925 
926  if(pFile)
927  {
928  CloseHandle(pFile);
929  }
930 
931  return ret;
932 
933 }
934 
935 BOOL
937 {
938  BOOL ret = FALSE;
939 
941  AddFilterRule(accessFlag,filterMask,L"");
942 
943  ULONG requestRegistration = PRE_QUERY_INFORMATION;
944  RegisterIoRequest(requestRegistration);
945 
946  HANDLE pFile = CreateFile(testFile,GENERIC_READ,NULL,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);
947  if( INVALID_HANDLE_VALUE == pFile )
948  {
949  PrintErrorMessage(L"Open test file failed.",GetLastError());
950  goto EXIT;
951  }
952  else
953  {
954  FILETIME creationTime;
955  FILETIME lastAccessTime;
956  FILETIME lastWriteTime;
957 
958  ret = GetFileTime(pFile,&creationTime,&lastAccessTime,&lastWriteTime );
959 
960  if(0 == ret)
961  {
962  PrintErrorMessage(L"QueryInformationControlDemo GetFileInformationByHandle failed.",GetLastError());
963  goto EXIT;
964  }
965  else
966  {
967  LARGE_INTEGER writeTime = GetTestFileTime();
968 
969  if( writeTime.HighPart != lastWriteTime.dwHighDateTime || writeTime.LowPart != lastWriteTime.dwLowDateTime )
970  {
971  ret = FALSE;
972  PrintErrorMessage(L"QueryInformationControlDemo failed. Return last write time is not correct", 0 );
973  }
974 
975  }
976 
977 
978  }
979 
980 EXIT:
981 
982  if( ret )
983  {
984  PrintPassedMessage(L"\nQueryInformationControlDemo passed.\n\n");
985  }
986  else
987  {
988  PrintFailedMessage(L"\nQueryInformationControlDemo failed.\n\n");
989  }
990 
991  if(pFile)
992  {
993  CloseHandle(pFile);
994  }
995 
996  return ret;
997 }
998 
999 BOOL
1001 {
1002  BOOL ret = FALSE;
1003 
1004  ULONG accessFlag = ALLOW_MAX_RIGHT_ACCESS;
1005  AddFilterRule(accessFlag,filterMask,L"");
1006 
1007  ULONG requestRegistration = PRE_SET_INFORMATION;
1008  RegisterIoRequest(requestRegistration);
1009 
1010  //
1011  //In PRE_SET_INFORMATION call back test function,we add the readonly attribute to the file.
1012  //
1013 
1014  ret = SetFileAttributes(testFile,FILE_ATTRIBUTE_NORMAL);
1015 
1016  if( 0 == ret)
1017  {
1018  PrintErrorMessage(L"SetInformationControlDemo SetFileAttributes failed.",GetLastError());
1019  return FALSE;
1020  }
1021 
1022  ULONG attributes = GetFileAttributes(testFile);
1023 
1024  if( INVALID_FILE_ATTRIBUTES == attributes )
1025  {
1026  PrintErrorMessage(L"SetInformationControlDemo GetFileAttributes failed.",GetLastError());
1027  return FALSE;
1028  }
1029 
1030  if( attributes & FILE_ATTRIBUTE_READONLY )
1031  {
1032  ret = TRUE;
1033  PrintPassedMessage(L"\nSetInformationControlDemo passed.\n\n");
1034  }
1035  else
1036  {
1037  PrintFailedMessage(L"\nSetInformationControlDemo failed.\n\n");
1038  }
1039 
1040 
1041  return ret;
1042 }
1043 
1044 BOOL
1046 {
1047  BOOL ret = FALSE;
1048 
1050  AddFilterRule(accessFlag,filterMask,L"");
1051 
1052  ULONG requestRegistration = POST_DIRECTORY;
1053  RegisterIoRequest(requestRegistration);
1054 
1055  WIN32_FIND_DATA ffd;
1056  HANDLE pFile = FindFirstFile(filterMask, &ffd);
1057 
1058  do
1059  {
1060  if (ffd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
1061  {
1062  printf(" %ws <DIR>\n", ffd.cFileName);
1063  }
1064  else
1065  {
1066  LARGE_INTEGER filesize;
1067  filesize.LowPart = ffd.nFileSizeLow;
1068  filesize.HighPart = ffd.nFileSizeHigh;
1069  printf(" %ws %I64d bytes\n", ffd.cFileName, filesize.QuadPart);
1070 
1071  if( filesize.QuadPart != GetTestFileSize())
1072  {
1073  PrintErrorMessage(L"Browse directory failed.Return file size is not the same as test file size.",0);
1074  ret = FALSE;
1075  break;
1076  }
1077  }
1078  }
1079  while (FindNextFile(pFile, &ffd) != 0);
1080 
1081  if( INVALID_HANDLE_VALUE != pFile )
1082  {
1083  FindClose(pFile);
1084  }
1085 
1086  DWORD dwError = GetLastError();
1087  if (dwError != ERROR_NO_MORE_FILES)
1088  {
1089  PrintErrorMessage(L"Browse directory test failed. Return error:",dwError);
1090  ret = FALSE;
1091  }
1092  else
1093  {
1094  PrintPassedMessage(L"\nBrowseDirectoryControlDemo passed.\n\n");
1095  ret = TRUE;
1096  }
1097 
1098  return ret;
1099 }
1100 
1101 void
1103 {
1104 
1105  if( !SetupTestEnvironment())
1106  {
1107  PrintErrorMessage(L"Failed to setup test environment.",0);
1108  return;
1109  }
1110 
1111  //Reset the filter config setting.
1112  ResetConfigData();
1113 
1114  //Set filter maiximum wait for user mode response time out.
1115  SetConnectionTimeout(30);
1116 
1117  //Set filter to file system call back type.
1118  if(!SetFilterType(FILE_SYSTEM_CONTROL))
1119  {
1120  PrintLastErrorMessage(L"Set filter type failed.");
1121  return;
1122  }
1123 
1125 
1127 
1128  AccessFlagControlDemo();//test excluded filter rule.
1129 
1131 
1133 
1135 
1136  /*QuerySecurityDemo();
1137 
1138  SetSecurityDemo();*/
1139 
1141 }
BOOL SetupTestEnvironment()
BYTE ULONG bufferLength
Definition: FilterAPI.h:812
BOOL SetInformationControlDemo()
BOOL ReparseFilterRuleDemo()
void PrintErrorMessage(LPWSTR message, DWORD errorCode)
Definition: Tools.cpp:93
BOOL IsTestFolder(WCHAR *fileName)
Definition: FeatureDemo.cpp:43
CHAR * GetReplaceData()
Definition: FeatureDemo.cpp:68
BOOL CreateTestFile(WCHAR *folder, WCHAR *fileName, CHAR *data)
BOOL IsTestFile(WCHAR *fileName, ULONG fileNameLength)
Definition: FeatureDemo.cpp:30
void SDKDemo()
BOOL WriteControlFilterDemo()
WCHAR * filterMask
Definition: FilterAPI.h:557
LARGE_INTEGER GetTestFileTime()
Definition: FeatureDemo.cpp:80
WCHAR * GetFilterMask()
Definition: FeatureDemo.cpp:56
LONGLONG GetTestFileSize()
Definition: FeatureDemo.cpp:74
BOOL ReadControlFilterDemo()
BOOL BrowseDirectoryControlDemo()
WCHAR * testFolder
WCHAR * GetTestReparseFileName()
Definition: FeatureDemo.cpp:62
BOOL AccessFlagControlDemo()
void PrintLastErrorMessage(WCHAR *message)
Definition: Tools.cpp:49
void PrintPassedMessage(WCHAR *message)
Definition: Tools.cpp:33
BOOL QueryInformationControlDemo()
void PrintFailedMessage(WCHAR *message)
Definition: Tools.cpp:39
LONGLONG data
Definition: FilterAPI.h:521
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