Re: 7.0 BETA1 and Thinkpad T61p : Wireless misadventure

Abdullah Ibn Hamad Al-Marri <[email protected]>
Newsgroups gmane.os.freebsd.stable,gmane.os.freebsd.devel.mobile
Message-ID <[email protected]>
----- Original Message ----

From: Scot Hetzel <[email protected]>

To: Mike Pumford <[email protected]>

Cc: [email protected]; [email protected]; Abdullah Ibn Hamad Al-Marri <[email protected]>

Sent: Wednesday, October 31, 2007 6:56:58 AM

Subject: Re: 7.0 BETA1 and Thinkpad T61p : Wireless misadventure



 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





-----Inline Attachment Follows-----



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







-----Inline Attachment Follows-----



____________


Hello Marcin,

Could you please try this patch which modified by Mr. Scot Hetzel please?



-- 

Regards, 

-Abdullah Ibn Hamad Al-Marri

Arab Portal

http://www.WeArab.Net/










__________________________________________________
Do You Yahoo!?
Tired of spam?  Yahoo! Mail has the best spam protection around 
http://mail.yahoo.com 
_______________________________________________
[email protected] mailing list
http://lists.freebsd.org/mailman/listinfo/freebsd-stable
To unsubscribe, send any mail to "[email protected]"
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.