7.0 BETA1 and Thinkpad T61p : Wireless misadventure
Scot Hetzel
swhetzel at gmail.com
Tue Oct 30 23:41:04 PDT 2007
On 10/30/07, Mike Pumford <mpumford at mpc-data.co.uk> 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
-------------- next part --------------
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
More information about the freebsd-mobile
mailing list