ReactOS Fundraising Campaign 2012
 
€ 4,410 / € 30,000

Information | Donate

Home | Info | Community | Development | myReactOS | Contact Us

  1. Home
  2. Community
  3. Development
  4. myReactOS
  5. Fundraiser 2012

  1. Main Page
  2. Alphabetical List
  3. Data Structures
  4. Directories
  5. File List
  6. Data Fields
  7. Globals
  8. Related Pages

ReactOS Development > Doxygen

probe.h
Go to the documentation of this file.
00001 #pragma once
00002 
00003 #include <reactos/probe.h>
00004 
00005 static
00006 __inline
00007 NTSTATUS
00008 DefaultSetInfoBufferCheck(ULONG Class,
00009                           const INFORMATION_CLASS_INFO *ClassList,
00010                           ULONG ClassListEntries,
00011                           PVOID Buffer,
00012                           ULONG BufferLength,
00013                           KPROCESSOR_MODE PreviousMode)
00014 {
00015     NTSTATUS Status = STATUS_SUCCESS;
00016 
00017     if (Class < ClassListEntries)
00018     {
00019         if (!(ClassList[Class].Flags & ICIF_SET))
00020         {
00021             Status = STATUS_INVALID_INFO_CLASS;
00022         }
00023         else if (ClassList[Class].RequiredSizeSET > 0 &&
00024                  BufferLength != ClassList[Class].RequiredSizeSET)
00025         {
00026             if (!(ClassList[Class].Flags & ICIF_SET_SIZE_VARIABLE))
00027             {
00028                 Status = STATUS_INFO_LENGTH_MISMATCH;
00029             }
00030         }
00031 
00032         if (NT_SUCCESS(Status))
00033         {
00034             if (PreviousMode != KernelMode)
00035             {
00036                 _SEH2_TRY
00037                 {
00038                     ProbeForRead(Buffer,
00039                                  BufferLength,
00040                                  ClassList[Class].AlignmentSET);
00041                 }
00042                 _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
00043                 {
00044                     Status = _SEH2_GetExceptionCode();
00045                 }
00046                 _SEH2_END;
00047             }
00048         }
00049     }
00050     else
00051         Status = STATUS_INVALID_INFO_CLASS;
00052 
00053     return Status;
00054 }
00055 
00056 static
00057 __inline
00058 NTSTATUS
00059 DefaultQueryInfoBufferCheck(ULONG Class,
00060                             const INFORMATION_CLASS_INFO *ClassList,
00061                             ULONG ClassListEntries,
00062                             PVOID Buffer,
00063                             ULONG BufferLength,
00064                             PULONG ReturnLength,
00065                             PULONG_PTR ReturnLengthPtr,
00066                             KPROCESSOR_MODE PreviousMode)
00067 {
00068     NTSTATUS Status = STATUS_SUCCESS;
00069 
00070     if (Class < ClassListEntries)
00071     {
00072         if (!(ClassList[Class].Flags & ICIF_QUERY))
00073         {
00074             Status = STATUS_INVALID_INFO_CLASS;
00075         }
00076         else if (ClassList[Class].RequiredSizeQUERY > 0 &&
00077                  BufferLength != ClassList[Class].RequiredSizeQUERY)
00078         {
00079             if (!(ClassList[Class].Flags & ICIF_QUERY_SIZE_VARIABLE))
00080             {
00081                 Status = STATUS_INFO_LENGTH_MISMATCH;
00082             }
00083         }
00084 
00085         if (NT_SUCCESS(Status))
00086         {
00087             if (PreviousMode != KernelMode)
00088             {
00089                 _SEH2_TRY
00090                 {
00091                     if (Buffer != NULL)
00092                     {
00093                         ProbeForWrite(Buffer,
00094                                       BufferLength,
00095                                       ClassList[Class].AlignmentQUERY);
00096                     }
00097 
00098                     if (ReturnLength != NULL)
00099                     {
00100                         ProbeForWriteUlong(ReturnLength);
00101                     }
00102                     if (ReturnLengthPtr != NULL)
00103                     {
00104                         ProbeForWrite(ReturnLengthPtr, sizeof(ULONG_PTR), sizeof(ULONG_PTR));
00105                     }
00106                 }
00107                 _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
00108                 {
00109                     Status = _SEH2_GetExceptionCode();
00110                 }
00111                 _SEH2_END;
00112             }
00113         }
00114     }
00115     else
00116         Status = STATUS_INVALID_INFO_CLASS;
00117 
00118     return Status;
00119 }

Generated on Sat May 26 2012 04:32:06 for ReactOS by doxygen 1.7.6.1

ReactOS is a registered trademark or a trademark of ReactOS Foundation in the United States and other countries.