Author: gedmurphy
Date: Sun Apr  3 16:22:15 2011
New Revision: 51241

URL: http://svn.reactos.org/svn/reactos?rev=51241&view=rev
Log:
[FULLFAT]
- Add the kernel APIs required by the library

Modified:
    trunk/reactos/lib/3rdparty/fullfat/ff_safety.c

Modified: trunk/reactos/lib/3rdparty/fullfat/ff_safety.c
URL: 
http://svn.reactos.org/svn/reactos/trunk/reactos/lib/3rdparty/fullfat/ff_safety.c?rev=51241&r1=51240&r2=51241&view=diff
==============================================================================
--- trunk/reactos/lib/3rdparty/fullfat/ff_safety.c [iso-8859-1] (original)
+++ trunk/reactos/lib/3rdparty/fullfat/ff_safety.c [iso-8859-1] Sun Apr  3 
16:22:15 2011
@@ -55,50 +55,113 @@
  **/
 
 #include "ff_safety.h" // Íncludes ff_types.h
+#include <ntifs.h>
 
+#define TAG_FULLFAT 'FLUF'
+
+// Call your OS's CreateSemaphore function
+//
 void *FF_CreateSemaphore(void) {
-       // Call your OS's CreateSemaphore function
-       //
+    PKSEMAPHORE ProcessSemaphore;
 
-       // return pointer to semaphore
-       return NULL;    // Comment this out for your implementation.
+    /* Allocate some memory to store the semaphore */
+    ProcessSemaphore = ExAllocatePoolWithTag(NonPagedPool,
+                                             sizeof(KSEMAPHORE),
+                                             TAG_FULLFAT);
+    if (ProcessSemaphore)
+    {
+        /* Initialize it */
+        KeInitializeSemaphore(ProcessSemaphore,
+                              0,
+                              MAXLONG);
+    }
+
+    return ProcessSemaphore;
 }
 
+// Call your OS's PendSemaphore with the provided pSemaphore pointer.
+//
+// This should block indefinitely until the Semaphore
+// becomes available. (No timeout!)
+// If your OS doesn't do it for you, you should sleep
+// this thread until the Semaphore is available.
 void FF_PendSemaphore(void *pSemaphore) {
-       // Call your OS's PendSemaphore with the provided pSemaphore pointer.
-       //
-       // This should block indefinitely until the Semaphore
-       // becomes available. (No timeout!)
-       // If your OS doesn't do it for you, you should sleep
-       // this thread until the Semaphore is available.
-       pSemaphore = 0;
+    NTSTATUS Status;
+
+    /* Sanity check */
+    if (pSemaphore)
+    {
+        /* Wait for the sempaphore to become signaled */
+        Status = KeWaitForSingleObject(pSemaphore,
+                                       Executive,
+                                       KernelMode,
+                                       FALSE,
+                                       NULL);
+        if (NT_SUCCESS(Status))
+        {
+            if (Status != STATUS_SUCCESS)
+            {
+                // log an error?
+            }
+        }
+        else
+        {
+            // log an error?
+        }
+    }
 }
 
+// Call your OS's ReleaseSemaphore with the provided pSemaphore pointer.
+//
 void FF_ReleaseSemaphore(void *pSemaphore) {
-       // Call your OS's ReleaseSemaphore with the provided pSemaphore pointer.
-       //
 
-       //
-       pSemaphore = 0;
+    /* Sanity check */
+    if (pSemaphore)
+    {
+        /* Increment the semaphore */
+        KeReleaseSemaphore(pSemaphore,
+                           0,
+                           1,
+                           FALSE);
+    }
 }
 
+// Call your OS's DestroySemaphore with the provided pSemaphore pointer.
+//
 void FF_DestroySemaphore(void *pSemaphore) {
-       // Call your OS's DestroySemaphore with the provided pSemaphore pointer.
-       //
 
-       //
-       pSemaphore = 0;
+    /* Sanity check */
+    if (pSemaphore)
+    {
+        /* Free the semaphore memory */
+        ExFreePoolWithTag(pSemaphore,
+                          TAG_FULLFAT);
+    }
 }
 
+// FIXME: what do we do with this?
 void FF_Yield(void) {
        // Call your OS's thread Yield function.
        // If this doesn't work, then a deadlock will occur
 }
 
+// Call your OS's thread sleep function,
+// Sleep for TimeMs milliseconds
 void FF_Sleep(FF_T_UINT32 TimeMs) {
-       // Call your OS's thread sleep function,
-       // Sleep for TimeMs milliseconds
-       TimeMs = 0;
+    LARGE_INTEGER Interval;
+    NTSTATUS Status;
+
+    /* Calculate the interval */
+    Interval.QuadPart = -((LONGLONG)TimeMs * 10000);
+
+    /* Do the wait */
+    Status = KeDelayExecutionThread(KernelMode,
+                                    FALSE,
+                                    &Interval);
+    if (!NT_SUCCESS(Status))
+    {
+        // log an error?
+    }
 }
 
 


Reply via email to