Re: 7.0 BETA1 and Thinkpad T61p : Wireless misadventure

"Scot Hetzel" <[email protected]>
Newsgroups gmane.os.freebsd.stable,gmane.os.freebsd.devel.mobile
Message-ID <[email protected]>
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

_______________________________________________
[email protected] mailing list
http://lists.freebsd.org/mailman/listinfo/freebsd-stable
To unsubscribe, send any mail to "[email protected]"
ndis.patch (text/plain, 11.6 KB)
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
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.