Windows: Reimplement AFSGenerateCRC()
authorPeter Scott <pscott@kerneldrivers.com>
Sat, 29 Oct 2011 15:34:07 +0000 (11:34 -0400)
committerJeffrey Altman <jaltman@secure-endpoints.com>
Tue, 1 Nov 2011 14:48:02 +0000 (07:48 -0700)
Replace the home grown CRC generation with a call to
RtlHashUnicodeString() which is present on Windows XP
and above.

Change-Id: Id98a1223e0aad54b3c43a16653ab888ac883639f
Reviewed-on: http://gerrit.openafs.org/5738
Reviewed-by: Rod Widdowson <rdw@steadingsoftware.com>
Tested-by: BuildBot <buildbot@rampaginggeek.com>
Tested-by: Jeffrey Altman <jaltman@secure-endpoints.com>
Reviewed-by: Jeffrey Altman <jaltman@secure-endpoints.com>

src/WINNT/afsrdr/kernel/lib/AFSData.cpp
src/WINNT/afsrdr/kernel/lib/AFSGeneric.cpp
src/WINNT/afsrdr/kernel/lib/Include/AFSCommon.h
src/WINNT/afsrdr/kernel/lib/Include/AFSExtern.h

index 2a69e47..377a3ef 100644 (file)
@@ -50,8 +50,6 @@ PDEVICE_OBJECT      AFSControlDeviceObject = NULL;
 
 PDEVICE_OBJECT      AFSRDRDeviceObject = NULL;
 
-unsigned long       AFSCRCTable[ 256];
-
 UNICODE_STRING      AFSRegistryPath;
 
 HANDLE              AFSSysProcess = NULL;
index 2ace0a0..797f3f2 100644 (file)
@@ -324,43 +324,6 @@ AFSCompleteRequest( IN PIRP Irp,
 }
 
 //
-// Function: AFSBuildCRCTable
-//
-// Description:
-//
-//      This function builds the CRC table for mapping filenames to a CRC value.
-//
-// Return:
-//
-//      A status is returned for the function
-//
-
-void
-AFSBuildCRCTable()
-{
-    ULONG crc;
-    int i, j;
-
-    for ( i = 0; i <= 255; i++)
-    {
-        crc = i;
-        for ( j = 8; j > 0; j--)
-        {
-            if (crc & 1)
-            {
-                crc = ( crc >> 1 ) ^ CRC32_POLYNOMIAL;
-            }
-            else
-            {
-                crc >>= 1;
-            }
-        }
-
-        AFSCRCTable[ i ] = crc;
-    }
-}
-
-//
 // Function: AFSGenerateCRC
 //
 // Description:
@@ -377,54 +340,20 @@ AFSGenerateCRC( IN PUNICODE_STRING FileName,
                 IN BOOLEAN UpperCaseName)
 {
 
-    ULONG crc;
-    ULONG temp1, temp2;
-    UNICODE_STRING UpcaseString;
-    WCHAR *lpbuffer;
-    USHORT size = 0;
-
-    if( !AFSCRCTable[1])
-    {
-        AFSBuildCRCTable();
-    }
-
-    crc = 0xFFFFFFFFL;
-
-    if( UpperCaseName)
-    {
-
-        RtlUpcaseUnicodeString( &UpcaseString,
-                                FileName,
-                                TRUE);
-
-        lpbuffer = UpcaseString.Buffer;
-
-        size = (UpcaseString.Length/sizeof( WCHAR));
-    }
-    else
-    {
-
-        lpbuffer = FileName->Buffer;
-
-        size = (FileName->Length/sizeof( WCHAR));
-    }
+    ULONG ulCRC = 0;
+    NTSTATUS ntStatus = STATUS_SUCCESS;
 
-    while (size--)
-    {
-        temp1 = (crc >> 8) & 0x00FFFFFFL;
-        temp2 = AFSCRCTable[((int)crc ^ *lpbuffer++) & 0xff];
-        crc = temp1 ^ temp2;
-    }
+    ntStatus = RtlHashUnicodeString( FileName,
+                                     UpperCaseName,
+                                     HASH_STRING_ALGORITHM_DEFAULT,
+                                     &ulCRC);
 
-    if( UpperCaseName)
+    if( !NT_SUCCESS( ntStatus))
     {
-
-        RtlFreeUnicodeString( &UpcaseString);
+        ulCRC = 0;
     }
 
-    crc ^= 0xFFFFFFFFL;
-
-    return crc;
+    return ulCRC;
 }
 
 void *
index 3bf1824..cdaa8e1 100644 (file)
@@ -1030,9 +1030,6 @@ void
 AFSCompleteRequest( IN PIRP Irp,
                     IN ULONG Status);
 
-void
-AFSBuildCRCTable( void);
-
 ULONG
 AFSGenerateCRC( IN PUNICODE_STRING FileName,
                 IN BOOLEAN UpperCaseName);
index 6596bd0..37c4fb6 100644 (file)
@@ -51,8 +51,6 @@ extern PDEVICE_OBJECT      AFSRDRDeviceObject;
 
 extern FAST_IO_DISPATCH    AFSFastIoDispatch;
 
-extern unsigned long       AFSCRCTable[];
-
 extern UNICODE_STRING      AFSRegistryPath;
 
 extern ULONG               AFSDebugFlags;