On 10/30/07, Mike Pumford <[EMAIL PROTECTED]> wrote:
> Abdullah Ibn Hamad Al-Marri wrote:
>
> >
> > Previously I didn't mention that there are some functions missing from
> >
> > the FreeBSD's NDIS api. These are:
> >
> > With the help of NDIS reference and Linux ndiswrapper I have been able
> >
> > to implement all but KeBugCheckEx (they are all rather simple but I
> >
> Can help you with this one. This is the Windows equivalent of panic().
> So just call panic with an appropriate string. If the string includes
> the bugcheck code and parameters so much the better.
>
Thanks for your hint to use panic() in the KeBugCheckEx function.
I have KeBugCheckEx partially implemented.  It currently prints the
bugcheck code
and the 4 paramators that are sent to KeBugCheckEx.

The KeBugCheckEx function still needs to be changed to display
the right information depending on the bugcheck code.



Abdullah, I made a minor change to your patch, strncat should be
prefixed with ntoskrnl_strncat.
changed IMPORT_CFUNC(strncat..) to IMPORT_CFUNC_MAP(ntoskrnl_strncat..).

Scot
Index: ndis_var.h
===================================================================
RCS file: /home/ncvs/src/sys/compat/ndis/ndis_var.h,v
retrieving revision 1.47
diff -u -r1.47 ndis_var.h
--- ndis_var.h  6 Apr 2007 11:18:57 -0000       1.47
+++ ndis_var.h  31 Oct 2007 03:31:24 -0000
@@ -49,6 +49,10 @@
 typedef register_t ndis_kspin_lock;
 typedef uint8_t ndis_kirql;
 
+/* Version of NDIS supported by FreeBSD */
+#define        NDIS_VERSION_51                 0x00050001
+#define        NDIS_VERSION                    NDIS_VERSION_51
+
 /*
  * NDIS status codes (there are lots of them). The ones that
  * don't seem to fit the pattern are actually mapped to generic
Index: ntoskrnl_var.h
===================================================================
RCS file: /home/ncvs/src/sys/compat/ndis/ntoskrnl_var.h,v
retrieving revision 1.43
diff -u -r1.43 ntoskrnl_var.h
--- ntoskrnl_var.h      17 Aug 2006 22:50:32 -0000      1.43
+++ ntoskrnl_var.h      31 Oct 2007 03:31:24 -0000
@@ -1202,14 +1202,22 @@
 
 /* Memory pool types, for ExAllocatePoolWithTag() */
 
-#define NonPagedPool                   0x00000000
-#define PagedPool                      0x00000001
-#define NonPagedPoolMustSucceed                0x00000002
-#define DontUseThisType                        0x00000003
-#define NonPagedPoolCacheAligned       0x00000004
-#define PagedPoolCacheAligned          0x00000005
-#define NonPagedPoolCacheAlignedMustS  0x00000006
-#define MaxPoolType                    0x00000007
+#define        NonPagedPool                            0x00000000
+#define        PagedPool                               0x00000001
+#define        NonPagedPoolMustSucceed                 0x00000002
+#define        DontUseThisType                         0x00000003
+#define        NonPagedPoolCacheAligned                0x00000004
+#define        PagedPoolCacheAligned                   0x00000005
+#define        NonPagedPoolCacheAlignedMustS           0x00000006
+#define        MaxPoolType                             0x00000007
+
+#define        NonPagedPoolSession                     0x00000020
+#define        PagedPoolSession                        0x00000021
+#define        NonPagedPoolMustSucceedSession          0x00000022
+#define        DontUseThisTypeSession                  0x00000023
+#define        NonPagedPoolCacheAlignedSession         0x00000024
+#define        PagedPoolCacheAlignedSession            0x00000025
+#define        NonPagedPoolCacheAlignedMustSSession    0x00000026
 
 /*
  * IO_WORKITEM is an opaque structures that must be allocated
@@ -1357,8 +1365,12 @@
 extern uint8_t KeSynchronizeExecution(kinterrupt *, void *, void *);
 extern uintptr_t InterlockedExchange(volatile uint32_t *,
        uintptr_t);
+extern void *ExAllocatePool(uint32_t, size_t);
+extern void *ExAllocatePoolWithQuota(uint32_t, size_t);
+extern void *ExAllocatePoolWithQuotaTag(uint32_t, size_t, uint32_t);
 extern void *ExAllocatePoolWithTag(uint32_t, size_t, uint32_t);
 extern void ExFreePool(void *);
+extern void ExFreePoolWithTag(void *, uint32_t);
 extern uint32_t IoConnectInterrupt(kinterrupt **, void *, void *,
        kspin_lock *, uint32_t, uint8_t, uint8_t, uint8_t, uint8_t,
        uint32_t, uint8_t);
Index: subr_ndis.c
===================================================================
RCS file: /home/ncvs/src/sys/compat/ndis/subr_ndis.c,v
retrieving revision 1.108
diff -u -r1.108 subr_ndis.c
--- subr_ndis.c 31 May 2007 11:51:49 -0000      1.108
+++ subr_ndis.c 31 Oct 2007 03:31:24 -0000
@@ -272,6 +272,7 @@
 static void NdisUnmapFile(ndis_handle);
 static void NdisCloseFile(ndis_handle);
 static uint8_t NdisSystemProcessorCount(void);
+static void NdisGetCurrentProcessorCounts(uint32_t *, uint32_t *, uint32_t*);
 static void NdisMIndicateStatusComplete(ndis_handle);
 static void NdisMIndicateStatus(ndis_handle, ndis_status,
         void *, uint32_t);
@@ -282,6 +283,7 @@
        uint32_t, uint32_t, ndis_packet *, uint32_t, uint32_t *);
 static void NdisCopyFromPacketToPacketSafe(ndis_packet *,
        uint32_t, uint32_t, ndis_packet *, uint32_t, uint32_t *, uint32_t);
+static void NdisIMCopySendPerPacketInfo(ndis_packet *, ndis_packet *);
 static ndis_status NdisMRegisterDevice(ndis_handle,
        unicode_string *, unicode_string *, driver_dispatch **,
        void **, ndis_handle *);
@@ -3115,6 +3117,20 @@
        return(mp_ncpus);
 }
 
+static void
+NdisGetCurrentProcessorCounts(idlecount, kerneluser, index)
+       uint32_t                *idlecount;
+       uint32_t                *kerneluser;
+       uint32_t                *index;
+{
+       int cpu = 0; /* Current CPU */
+
+       *idlecount = cp_time[CP_IDLE];
+       *kerneluser =   (cp_time[CP_USER] + cp_time[CP_NICE]) + \
+                       (cp_time[CP_SYS] + cp_time[CP_INTR]);
+       *index = cpu;
+}
+
 typedef void (*ndis_statusdone_handler)(ndis_handle);
 typedef void (*ndis_status_handler)(ndis_handle, ndis_status,
         void *, uint32_t);
@@ -3288,6 +3304,14 @@
        return;
 }
 
+static void
+NdisIMCopySendPerPacketInfo(dpkt, spkt)
+       ndis_packet             *dpkt;
+       ndis_packet             *spkt;
+{
+       memcpy(&dpkt->np_ext, &spkt->np_ext, sizeof(ndis_packet_extension));
+}
+
 static ndis_status
 NdisMRegisterDevice(handle, devname, symname, majorfuncs, devobj, devhandle)
        ndis_handle             handle;
@@ -3346,6 +3370,12 @@
        return;
 }
 
+static uint32_t
+NdisGetVersion()
+{
+       return(NDIS_VERSION);
+}
+
 static void
 dummy()
 {
@@ -3365,10 +3395,12 @@
 image_patch_table ndis_functbl[] = {
        IMPORT_SFUNC(NdisCopyFromPacketToPacket, 6),
        IMPORT_SFUNC(NdisCopyFromPacketToPacketSafe, 7),
+       IMPORT_SFUNC(NdisIMCopySendPerPacketInfo, 2),
        IMPORT_SFUNC(NdisScheduleWorkItem, 1),
        IMPORT_SFUNC(NdisMIndicateStatusComplete, 1),
        IMPORT_SFUNC(NdisMIndicateStatus, 4),
        IMPORT_SFUNC(NdisSystemProcessorCount, 0),
+       IMPORT_SFUNC(NdisGetCurrentProcessorCounts, 3),
        IMPORT_SFUNC(NdisUnchainBufferAtBack, 2),
        IMPORT_SFUNC(NdisGetFirstBufferFromPacket, 5),
        IMPORT_SFUNC(NdisGetFirstBufferFromPacketSafe, 6),
@@ -3482,6 +3514,7 @@
        IMPORT_SFUNC(NdisMDeregisterDevice, 1),
        IMPORT_SFUNC(NdisMQueryAdapterInstanceName, 2),
        IMPORT_SFUNC(NdisMRegisterUnloadHandler, 2),
+       IMPORT_SFUNC(NdisGetVersion, 0),
        IMPORT_SFUNC(ndis_timercall, 4),
        IMPORT_SFUNC(ndis_asyncmem_complete, 2),
        IMPORT_SFUNC(ndis_intr, 2),
Index: subr_ntoskrnl.c
===================================================================
RCS file: /home/ncvs/src/sys/compat/ndis/subr_ntoskrnl.c,v
retrieving revision 1.91
diff -u -r1.91 subr_ntoskrnl.c
--- subr_ntoskrnl.c     20 Oct 2007 23:23:12 -0000      1.91
+++ subr_ntoskrnl.c     31 Oct 2007 03:31:24 -0000
@@ -219,6 +219,8 @@
 static int rand(void);
 static void srand(unsigned int);
 static void ntoskrnl_time(uint64_t *);
+static void KeQuerySystemTime(uint64_t *);
+static uint32_t KeTickCount(void);
 static uint8_t IoIsWdmVersionAvailable(uint8_t, uint8_t);
 static void ntoskrnl_thrfunc(void *);
 static ndis_status PsCreateSystemThread(ndis_handle *,
@@ -226,6 +228,8 @@
 static ndis_status PsTerminateSystemThread(ndis_status);
 static ndis_status IoGetDeviceProperty(device_object *, uint32_t,
        uint32_t, void *, uint32_t *);
+static void KeBugCheckEx(uint32_t , uint32_t *, uint32_t *, uint32_t *,
+       uint32_t *);
 static void KeInitializeMutex(kmutant *, uint32_t);
 static uint32_t KeReleaseMutex(kmutant *, uint8_t);
 static uint32_t KeReadStateMutex(kmutant *);
@@ -238,8 +242,10 @@
 static uint32_t WmiTraceMessage(uint64_t, uint32_t, void *, uint16_t, ...);
 static uint32_t IoWMIRegistrationControl(device_object *, uint32_t);
 static void *ntoskrnl_memset(void *, int, size_t);
+static int ntoskrnl_memcmp(void *, void *, size_t);
 static void *ntoskrnl_memmove(void *, void *, size_t);
 static void *ntoskrnl_memchr(void *, unsigned char, size_t);
+static char *ntoskrnl_strncat(char *, char *, size_t);
 static char *ntoskrnl_strstr(char *, char *);
 static int ntoskrnl_toupper(int);
 static int ntoskrnl_tolower(int);
@@ -429,6 +435,16 @@
        return(memset(buf, ch, size));
 }
 
+
+static int
+ntoskrnl_memcmp(buf1, buf2, size)
+       void                    *buf1;
+       void                    *buf2;
+       size_t                  size;
+{
+       return(memcmp(buf1, buf2, size));
+}
+
 static void *
 ntoskrnl_memmove(dst, src, size)
        void                    *src;
@@ -456,6 +472,29 @@
        return (NULL);
 }
 
+/* Taken from libc */
+char *
+ntoskrnl_strncat(dst, src, n)
+       char            *dst;
+       char            *src;
+       size_t          n;
+{
+       if (n != 0) {
+               char *d = dst;
+               const char *s = src;
+               
+               while (*d != 0)
+                       d++;
+               do {
+                       if ((*d = *s++) == 0)
+                               break;
+                       d++;
+               } while (--n != 0);
+               *d = 0;
+       }
+       return (dst);
+}
+
 static char *
 ntoskrnl_strstr(s, find)
        char *s, *find;
@@ -624,6 +663,31 @@
 }
 
 void *
+ExAllocatePool(pooltype, len)
+       uint32_t                pooltype;
+       size_t                  len;
+{
+       return(ExAllocatePoolWithTag(pooltype, len, 0));
+}
+
+void *
+ExAllocatePoolWithQuota(pooltype, len)
+       uint32_t                pooltype;
+       size_t                  len;
+{
+       return(ExAllocatePoolWithTag(pooltype, len, 0));
+}
+
+void *
+ExAllocatePoolWithQuotaTag(pooltype, len, tag)
+       uint32_t                pooltype;
+       size_t                  len;
+       uint32_t                tag;
+{
+       return(ExAllocatePoolWithTag(pooltype, len, tag));
+}
+
+void *
 ExAllocatePoolWithTag(pooltype, len, tag)
        uint32_t                pooltype;
        size_t                  len;
@@ -642,6 +706,14 @@
 ExFreePool(buf)
        void                    *buf;
 {
+       ExFreePoolWithTag(buf, 0);
+}
+
+void
+ExFreePoolWithTag(buf, tag)
+       void                    *buf;
+       uint32_t                tag;
+{
        free(buf, M_DEVBUF);
        return;
 }
@@ -1587,6 +1659,21 @@
        return;
 }
 
+static void
+KeQuerySystemTime(current_time)
+       uint64_t                *current_time;
+{
+       ntoskrnl_time(current_time);
+}
+
+static uint32_t
+KeTickCount(void)
+{
+       struct timeval tv;
+       getmicrouptime(&tv);
+       return tvtohz(&tv);
+}
+
 /*
  * KeWaitForSingleObject() is a tricky beast, because it can be used
  * with several different object types: semaphores, timers, events,
@@ -2316,6 +2403,22 @@
 }
 
 void
+KeBugCheckEx(bugcheck, param1, param2, param3, param4)
+       uint32_t                bugcheck;
+       uint32_t                *param1;
+       uint32_t                *param2;
+       uint32_t                *param3;
+       uint32_t                *param4;
+{
+       /* http://msdn2.microsoft.com/en-us/library/ms801645.aspx */
+
+       panic("KeBugCheckEx: STOP: %#08x, (%8p, %8p, %8p, %8p)",
+               bugcheck, param1, param2, param3, param4);
+
+        return;
+}
+
+void
 KeInitializeSpinLock(lock)
        kspin_lock              *lock;
 {
@@ -2814,7 +2917,7 @@
        for (i = 0; i < WORKITEM_THREADS; i++) {
                kq = wq_queues + i;
                kq->kq_exit = 1;
-               KeSetEvent(&kq->kq_proc, IO_NO_INCREMENT, FALSE);       
+               KeSetEvent(&kq->kq_proc, IO_NO_INCREMENT, FALSE);
                while (kq->kq_exit)
                        tsleep(kq->kq_td->td_proc, PWAIT, "waitiw", hz/10);
        }
@@ -3182,7 +3285,10 @@
        uint8_t                 major;
        uint8_t                 minor;
 {
-       if (major == WDM_MAJOR && minor == WDM_MINOR_WINXP)
+       if (major == WDM_MAJOR && 
+          (minor == WDM_MINOR_WIN2003  ||      /* Windows 2003 */
+           minor == WDM_MINOR_WINXP    ||      /* Windows XP */
+           minor == WDM_MINOR_WIN2000))        /* Windows 2000 */
                return(TRUE);
        return(FALSE);
 }
@@ -4218,6 +4324,7 @@
        IMPORT_CFUNC(strncmp, 0),
        IMPORT_CFUNC(strcmp, 0),
        IMPORT_CFUNC_MAP(stricmp, strcasecmp, 0),
+       IMPORT_CFUNC_MAP(strncat, ntoskrnl_strncat, 0),
        IMPORT_CFUNC(strncpy, 0),
        IMPORT_CFUNC(strcpy, 0),
        IMPORT_CFUNC(strlen, 0),
@@ -4229,6 +4336,7 @@
        IMPORT_CFUNC(memcpy, 0),
        IMPORT_CFUNC_MAP(memmove, ntoskrnl_memmove, 0),
        IMPORT_CFUNC_MAP(memset, ntoskrnl_memset, 0),
+       IMPORT_CFUNC_MAP(memcmp, ntoskrnl_memcmp, 0),
        IMPORT_CFUNC_MAP(memchr, ntoskrnl_memchr, 0),
        IMPORT_SFUNC(IoAllocateDriverObjectExtension, 4),
        IMPORT_SFUNC(IoGetDriverObjectExtension, 2),
@@ -4290,8 +4398,12 @@
                InterlockedPushEntrySList, 2),
        IMPORT_FFUNC(ExInterlockedPopEntrySList, 2),
        IMPORT_FFUNC(ExInterlockedPushEntrySList, 3),
+       IMPORT_SFUNC(ExAllocatePool, 2),
+       IMPORT_SFUNC(ExAllocatePoolWithQuota, 2),
+       IMPORT_SFUNC(ExAllocatePoolWithQuotaTag, 3),
        IMPORT_SFUNC(ExAllocatePoolWithTag, 3),
        IMPORT_SFUNC(ExFreePool, 1),
+       IMPORT_SFUNC(ExFreePoolWithTag, 2),
 #ifdef __i386__
        IMPORT_FFUNC(KefAcquireSpinLockAtDpcLevel, 1),
        IMPORT_FFUNC(KefReleaseSpinLockFromDpcLevel,1),
@@ -4336,6 +4448,7 @@
        IMPORT_SFUNC(IoQueueWorkItem, 4),
        IMPORT_SFUNC(ExQueueWorkItem, 2),
        IMPORT_SFUNC(ntoskrnl_workitem, 2),
+       IMPORT_SFUNC(KeBugCheckEx, 5),
        IMPORT_SFUNC(KeInitializeMutex, 2),
        IMPORT_SFUNC(KeReleaseMutex, 2),
        IMPORT_SFUNC(KeReadStateMutex, 1),
@@ -4365,6 +4478,8 @@
        IMPORT_SFUNC(IoWMIRegistrationControl, 2),
        IMPORT_SFUNC(WmiQueryTraceInformation, 5),
        IMPORT_CFUNC(WmiTraceMessage, 0),
+       IMPORT_SFUNC(KeQuerySystemTime, 1),
+       IMPORT_CFUNC(KeTickCount, 0),
 
        /*
         * This last entry is a catch-all for any function we haven't
_______________________________________________
freebsd-stable@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/freebsd-stable
To unsubscribe, send any mail to "[EMAIL PROTECTED]"

Reply via email to